1

我有一个 Dockerfile,它pip install从 AWS 代码工件中执行一个包。安装需要一个身份验证令牌,所以我目前的方法是在构建脚本中生成动态/秘密 repo url,并将其作为构建 arg 传递给 Docker,这会在我的 Dockerfile 中导致这样的行:

ARG CORE_REPO_URL
ARG CORE_VERSION
RUN pip install -i $CORE_REPO_URL mylib_core==$CORE_VERSION

在命令中使用 ARGRUN会导致该层永远不会被缓存,因此即使库版本没有更改,这部分也会每次都重新构建。

有没有更好的方法来做到这一点,以便除非CORE_VERSION更改,否则将使用层缓存?

也许我应该aws在图像中安装工具链,以便可以在较早的步骤中在其中生成动态 repo url(每次都使用相同的命令,因此它不需要 ARG 并希望缓存图层)?这样做的一个缺点是必须将 AWS 凭证放入映像中。docker secrets如果这是唯一的解决方案,我也许可以避免这种情况。

4

2 回答 2

1

我们已经设法使用 docker/buildkit secrets 解决了私有 npm 模块的问题:

RUN --mount=type=secret,id=npmrc,dst=/root/.npmrc npm install --ignore-scripts --no-audit

当我们运行 docker build 命令时:

docker buildx build --secret id=npmrc,src=$HOME/.npmrc .

采用这种方法时,即使令牌更改,缓存也不会失效。

于 2021-11-10T00:40:52.183 回答
1

想出我的用例:

  • 在 CA 中打包
  • 多帐户设置,您可以在其中承担角色以到达您需要的地方。

希望这将帮助其他发现此问题的人。

使用假定角色配置文件构建 Docker

请记住使用 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}
于 2021-10-12T10:01:18.757 回答