如何在 AWSCodeBuild 中*在* Dockerfile 中使用 AWS CodeArtifact

How to use AWS CodeArtifact *within* A Dockerfile in AWSCodeBuild

我正在尝试从 aws codebuild 中的 dockerbuild 中的 codeartifact 进行 pip 安装。

这篇文章并没有完全解决我的问题:https://docs.aws.amazon.com/codeartifact/latest/ug/using-python-packages-in-codebuild.html

AWS CodeArtifct 的登录在预构建中;在 Docker 上下文之外。

但我的 pip install 我的 Docker 文件中(我们从私有 pypi 注册表中提取)。

我该怎么做,而不做一些可怕的事情,比如将 env 变量设置为从读取 ~/.config/pip.conf/ 后 运行 预构建中的登录命令派生的密码?

所以,这是我现在解决这个问题的方法。看起来有点老套,但它确实有效。 (编辑:我们已经切换到@phistrom 答案)

  1. 在预构建中,我 运行 命令并将 ~/.config/pip/pip.conf 复制到当前构建目录:
pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      ...
      - echo Fetching pip.conf for PYPI
      - aws codeartifact --region us-east-1 login --tool pip --repository ....
      - cp ~/.config/pip/pip.conf .
  build:
    commands:
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
  1. 然后在 Dockerfile 中,我 COPY 那个文件,执行 pip install,然后 rm it
COPY requirements.txt pkg/
COPY --chown=myuser:myuser pip.conf /home/myuser/.config/pip/pip.conf
RUN pip install -r ./pkg/requirements.txt
RUN pip install ./pkg
RUN rm /home/myuser/.config/pip/pip.conf

可以使用环境 变量:PIP_INDEX_URL[1].

下面是一个 AWS CodeBuild buildspec.yml 文件,我们在其中构建 PIP_INDEX_URL CodeArtifact 通过使用 this example from the AWS documentation.

buildspec.yml

  pre_build:
    commands:
      - echo Getting CodeArtifact authorization...
      - export CODEARTIFACT_AUTH_TOKEN=$(aws codeartifact get-authorization-token --domain "${CODEARTIFACT_DOMAIN}" --domain-owner "${AWS_ACCOUNT_ID}" --query authorizationToken --output text)
      - export PIP_INDEX_URL="https://aws:${CODEARTIFACT_AUTH_TOKEN}@${CODEARTIFACT_DOMAIN}-${AWS_ACCOUNT_ID}.d.codeartifact.${AWS_DEFAULT_REGION}.amazonaws.com/pypi/${CODEARTIFACT_REPO}/simple/"

在您的 Docker 文件 中,在正上方添加 ARG PIP_INDEX_URL 行 你的 RUN pip install -r requirements.txt 所以它可以成为一个环境 构建过程中的变量:

Dockerfile

# this needs to be added before your pip install line!
ARG PIP_INDEX_URL

RUN pip install -r requirements.txt

最后,我们使用 PIP_INDEX_URL build-arg 构建图像。

buildspec.yml

  build:
    commands:
      - echo Building the Docker image...
      - docker build -t "${IMAGE_REPO_NAME}" --build-arg PIP_INDEX_URL .

顺便说一句,将 ARG PIP_INDEX_URL 添加到您的 Docker 文件应该不会破坏任何 现有 CI 或工作流程。如果省略 --build-arg PIP_INDEX_URL 时 构建图像,pip 仍将使用默认的 PyPI 索引。

指定 --build-arg PIP_INDEX_URL=${PIP_INDEX_URL} 有效,但是 不必要。指定没有值的参数名称将使 Docker 它的值来自相同的环境变量 姓名[2].

安全说明:如果有人运行docker history ${IMAGE_REPO_NAME},他们可以 看到价值 共 ${PIP_INDEX_URL}[3] .不过,令牌最多只能使用 12 小时,您可以缩短 使用 --duration-seconds 参数将其缩短为 15 分钟 aws codeartifact get-authorization-token[4], 所以也许这是可以接受的。如果您的 Docker 文件是多阶段构建,那么它 如果您不在目标中使用 ARG PIP_INDEX_URL 应该不是问题 阶段。 docker build --secret 目前 CodeBuild 似乎不支持。