Docker 层缓存的构建时秘密
Docker Build-time Secrets with Layer Caching
我有一个 Docker 文件,它对来自 AWS 代码工件的包执行 pip install
。安装需要一个授权令牌,所以我目前的方法是在构建脚本中生成 dynamic/secret repo url 并将其作为构建参数传递到 Docker 中,这导致像这样的行在我的 Docker 文件中:
ARG CORE_REPO_URL
ARG CORE_VERSION
RUN pip install -i $CORE_REPO_URL mylib_core==$CORE_VERSION
在 RUN
命令中使用 ARG 导致该层永远不会被缓存,因此即使库版本没有改变,这部分每次都会重建。
是否有更好的方法来执行此操作,以便在 CORE_VERSION
更改之前使用图层缓存?
也许我应该在图像中安装 aws
工具链,这样动态回购 url 可以在较早的步骤中在那里生成(每次都使用相同的命令,所以它不会'不需要 ARG 并希望缓存该层)?这样做的一个缺点是必须将 AWS 凭证放入图像中。如果那是唯一的解决方案,我也许可以让 docker secrets
来避免这种情况。
找出我的用例:
- CA 中的包裹
- 多帐户设置,您可以在其中扮演一个角色来到达您需要的地方。
希望这能帮助其他找到它的人。
Docker Build using an Assumed Role Profile
记得使用 buildkit 进行构建
# syntax = docker/dockerfile:experimental
# This needs to go at the top of the file or it will break ^
# installing requirements NB, You can probably just take this image it's real small and depending on latest isn't the best, but idc only working on a poc.
FROM amazon/aws-cli:latest AS dependencies
ARG PYTHONLIBS
ARG PROFILE
ENV AWS_DEFAULT_PROFILE=$PROFILE
COPY ./requirements.txt .
# NB I had this here as I was assuming a role you may not need it.
COPY ./config /root/.aws/config
RUN yum install -y pip
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials aws codeartifact login --tool pip --repository //rest of command
RUN pip install -r requirements.txt --target ${PYTHONLIBS}
我们已经设法使用 docker/buildkit 秘密解决了私有 npm 模块的这个问题:
RUN --mount=type=secret,id=npmrc,dst=/root/.npmrc npm install --ignore-scripts --no-audit
当我们 运行 docker 构建命令时:
docker buildx build --secret id=npmrc,src=$HOME/.npmrc .
采用这种方法时,即使令牌发生变化,缓存也不会失效。
我有一个 Docker 文件,它对来自 AWS 代码工件的包执行 pip install
。安装需要一个授权令牌,所以我目前的方法是在构建脚本中生成 dynamic/secret repo url 并将其作为构建参数传递到 Docker 中,这导致像这样的行在我的 Docker 文件中:
ARG CORE_REPO_URL
ARG CORE_VERSION
RUN pip install -i $CORE_REPO_URL mylib_core==$CORE_VERSION
在 RUN
命令中使用 ARG 导致该层永远不会被缓存,因此即使库版本没有改变,这部分每次都会重建。
是否有更好的方法来执行此操作,以便在 CORE_VERSION
更改之前使用图层缓存?
也许我应该在图像中安装 aws
工具链,这样动态回购 url 可以在较早的步骤中在那里生成(每次都使用相同的命令,所以它不会'不需要 ARG 并希望缓存该层)?这样做的一个缺点是必须将 AWS 凭证放入图像中。如果那是唯一的解决方案,我也许可以让 docker secrets
来避免这种情况。
找出我的用例:
- CA 中的包裹
- 多帐户设置,您可以在其中扮演一个角色来到达您需要的地方。
希望这能帮助其他找到它的人。
Docker Build using an Assumed Role Profile
记得使用 buildkit 进行构建
# syntax = docker/dockerfile:experimental
# This needs to go at the top of the file or it will break ^
# installing requirements NB, You can probably just take this image it's real small and depending on latest isn't the best, but idc only working on a poc.
FROM amazon/aws-cli:latest AS dependencies
ARG PYTHONLIBS
ARG PROFILE
ENV AWS_DEFAULT_PROFILE=$PROFILE
COPY ./requirements.txt .
# NB I had this here as I was assuming a role you may not need it.
COPY ./config /root/.aws/config
RUN yum install -y pip
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials aws codeartifact login --tool pip --repository //rest of command
RUN pip install -r requirements.txt --target ${PYTHONLIBS}
我们已经设法使用 docker/buildkit 秘密解决了私有 npm 模块的这个问题:
RUN --mount=type=secret,id=npmrc,dst=/root/.npmrc npm install --ignore-scripts --no-audit
当我们 运行 docker 构建命令时:
docker buildx build --secret id=npmrc,src=$HOME/.npmrc .
采用这种方法时,即使令牌发生变化,缓存也不会失效。