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 .

采用这种方法时,即使令牌发生变化,缓存也不会失效。