在构建 Dockerfile 之前从具有 docker-compose 卷的主机移动文件
Moving a file from host with docker-compose volume before Dockerfile is built
我有一些 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 文件的卷,但是当命令 RUN --mount=type=secret...
为 运行ning 时我得到 cat: /pat: No such file or directory
。这可能不安全,但只会在本地 运行ning。
我的 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 卷?
我用不同的方式解决了这个问题。由于主要目标是让这个在本地工作,我创建了 Dockerfile.Local 和 docker-compose.local.yml。与此一起,我创建了一个包含“pat”的 .env 文件。
docker-compose.local.yml 将“pat”作为参数传递给使用它的 Dockerfile.Local。我也舍弃了--mount=type=secret
,直接把值设为VSS_NUGET_EXTERNAL_FEED_ENDPOINTS
。
.env 文件:
PAT_TOKEN=<personal access token>
docker-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.Local:
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 中,因为它包含敏感信息。我们不希望它出现在我们的存储库中.
我有一些 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 文件的卷,但是当命令 RUN --mount=type=secret...
为 运行ning 时我得到 cat: /pat: No such file or directory
。这可能不安全,但只会在本地 运行ning。
我的 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 卷?
我用不同的方式解决了这个问题。由于主要目标是让这个在本地工作,我创建了 Dockerfile.Local 和 docker-compose.local.yml。与此一起,我创建了一个包含“pat”的 .env 文件。
docker-compose.local.yml 将“pat”作为参数传递给使用它的 Dockerfile.Local。我也舍弃了--mount=type=secret
,直接把值设为VSS_NUGET_EXTERNAL_FEED_ENDPOINTS
。
.env 文件:
PAT_TOKEN=<personal access token>
docker-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.Local:
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 中,因为它包含敏感信息。我们不希望它出现在我们的存储库中.