如何在 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 答案)
- 在预构建中,我 运行 命令并将
~/.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
- 然后在 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 似乎不支持。
我正在尝试从 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 答案)
- 在预构建中,我 运行 命令并将
~/.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
- 然后在 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 似乎不支持。