7

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

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

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

但我pip install在我的Dockerfile中(我们从私有 pypi 注册表中提取)。

我该如何做到这一点,而不做一些可怕的事情,比如~/.config/pip.conf/在预构建中运行登录命令后将环境变量设置为读取的密码?

4

2 回答 2

7

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

下面是一个 AWS CodeBuildbuildspec.yml文件,我们在其中 使用AWS 文档中的这个示例PIP_INDEX_URL为 CodeArtifact 构建。

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/"

在您的Dockerfile中,在您的正上方添加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_URLbuild-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到 Dockerfile 不应破坏任何现有的 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 小时,您可以使用[4]--duration-seconds的参数将其缩短至 15 分钟,所以这可能是可以接受的。如果您的 Dockerfile 是一个多阶段构建,那么如果您没有在目标阶段使用它应该不是问题。CodeBuild 目前似乎不支持。aws codeartifact get-authorization-tokenARG PIP_INDEX_URLdocker build --secret

于 2021-08-03T02:23:19.187 回答
5

所以,这就是我现在解决这个问题的方法。看起来有点hacky,但它有效:

  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

于 2021-05-07T00:06:20.547 回答