1

我有一些 Dockerfile 依赖于“pat”(个人访问令牌)文件,以便能够访问私有 nuget 提要。我从somakdas获得了一些灵感来完成这项工作。

要运行我的单个 Dockerfile,我首先创建一个包含我的令牌的“pat”文件并使用docker build -f Services/User.API/Dockerfile -t userapi:dev --secret id=pat,src=pat .

这按预期工作,但我的问题是使用 docker-compose.yml 文件让它工作。

首先我看了一下如何使用 docker-compose secrets,但我注意到 docker-compose secrets 是在运行时访问的,而不是在构建时访问的。https://github.com/docker/compose/issues/6358

所以现在我正在尝试创建一个包含我的 pat 文件的卷,但是cat: /pat: No such file or directory当命令RUN --mount=type=secret...运行时我得到了。这可能不安全,但它只会在本地运行。

我的 Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
RUN wget -qO- https://raw.githubusercontent.com/Microsoft/artifacts-credprovider/master/helpers/installcredprovider.sh | bash

WORKDIR /src
COPY ["User.API.csproj", "/Services/User.API"]

RUN --mount=type=secret,id=pat,dst=/pat export ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS="{\"endpointCredentials\": [{\"endpoint\":\"<feed>\", \"username\":\"<user>\", \"password\":\"`cat /pat`\"}]}" \
&& dotnet restore "User.API.csproj" \
&& unset VSS_NUGET_EXTERNAL_FEED_ENDPOINTS

...

我的 docker-compose.yml

services:
  user.api:
    container_name: User.API
    image: ${DOCKER_REGISTRY-}userapi
    build:
      context: .
      dockerfile: Services/User.API/Dockerfile
    networks:
      - app_network
    volumes:
      - ./pat:/app/src/pat

构建 Dockerfile 后,我只能访问 docker-compose 卷吗?

4

1 回答 1

0

我通过以不同的方式解决问题来解决这个问题。由于主要目标是让它在本地工作,我创建了 Dockerfile.Local 和 docker-compose.local.yml。与此同时,我创建了一个包含“pat”的 .env 文件。

docker-compose.local.yml 将“pat”作为参数传递给使用它的 Dockerfile.Local。我也丢弃--mount=type=secretVSS_NUGET_EXTERNAL_FEED_ENDPOINTS直接将值设置为。

.env 文件:

PAT_TOKEN=<personal access token>

码头工人-compose.local.yml:

services:
  user.api:
    container_name: User.API
    image: ${DOCKER_REGISTRY-}userapi
    build:
      context: .
      dockerfile: Services/User.API/Dockerfile
    args:
      - PAT=${PAT_TOKEN}
    networks:
      - app_network
    volumes:
      - ./pat:/app/src/pat

Dockerfile.本地:

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
RUN wget -qO- https://raw.githubusercontent.com/Microsoft/artifacts-credprovider/master/helpers/installcredprovider.sh | bash

WORKDIR /src
COPY ["User.API.csproj", "/Services/User.API"]

ARG PAT
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS="{\"endpointCredentials\": [{\"endpoint\":\"<feed>\", \"username\":\"<user>\", \"password\":\"${PAT}\"}]}" \
&& dotnet restore "User.API.csproj" \
&& unset VSS_NUGET_EXTERNAL_FEED_ENDPOINTS

...

注意: .env 文件被添加到 .gitignore 是因为它包含敏感信息。我们不希望它出现在我们的存储库中

于 2022-02-10T16:39:18.607 回答