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



我正在尝试从aws代码构建中的dockerbuild中的codeartifact进行pip安装。

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

AWS CodeArtifact的登录位于预构建中;Docker上下文之外。

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

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

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

下面是一个AWS CodeBuildbuildspec.yml文件,我们在其中构造PIP_INDEX_URL通过使用这个例子来自AWS文档。

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_URL构建参数构建图像。

buildspec.yml

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

顺便说一句,在Dockerfile中添加ARG PIP_INDEX_URL不会破坏任何现有CI或工作流。如果--build-arg PIP_INDEX_URL在在构建图像时,pip仍将使用默认的PyPI索引。

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

安全说明:如果有人运行docker history ${IMAGE_REPO_NAME},他们可以查看值CCD_ 16[3]。不过,代币的有效期最长为12小时,您可以缩短使用--duration-seconds参数将其缩短至15分钟在CCD_ 18[4]中,所以也许这是可以接受的。如果你的Dockerfile是一个多阶段构建,那么它如果你没有在目标中使用ARG PIP_INDEX_URL,应该不会成为问题阶段此时CodeBuild中似乎不支持docker build --secret

因此,以下是我目前解决此问题的方法。看起来有点古怪,但它有效。(编辑:我们已经切换到@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中,ICOPY中的文件,执行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

最新更新