我正在尝试使用CodePipeline来构建一个将使用ARM-64 Graviton2处理器的docker映像。我有一个自定义的构建文件:
#########
# Build Spec
#
# The build spec is used to build the image in code deploy. When using AWS
# CodePipeline, use this customized buildspec.
#
#########
version: 0.2
run-as: root
artifacts:
files:
- Dockerrun.aws.json
- imagedefinitions.json
phases:
install:
runtime-versions:
php: 7.4
build:
commands:
- echo Build started on `date`
- cp app/config/config.sample.php app/config/config.php
post_build:
commands:
- echo Build completed on `date`
- which aws
- AWS_PASSWORD="$(aws ecr get-login-password --region us-east-1)"
- docker build -t live -f docker/live/Dockerfile .
- docker login -u AWS -p $AWS_PASSWORD xxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com
- docker tag live:latest xxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/live:latest
- docker push xxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/live:latest
- mv docker/Dockerrun.aws.json Dockerrun.aws.json
- echo Pushing the Docker image...
- echo Writing image definitions file...
- printf '[{"name":"live","imageUri":"%s"}]' xxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/live:latest > imagedefinitions.json
终于成功了!但是当我添加/更改时
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7
它完全失败了。以下是它的外观:
#########
# Build Spec
#
# The build spec is used to build the image in code deploy. When using AWS
# CodePipeline, use this customized buildspec.
#
#########
version: 0.2
run-as: root
artifacts:
files:
- Dockerrun.aws.json
- imagedefinitions.json
phases:
install:
runtime-versions:
php: 7.4
build:
commands:
- echo Build started on `date`
- cp app/config/config.sample.php app/config/config.php
post_build:
commands:
- echo Build completed on `date`
- which aws
- AWS_PASSWORD="$(aws ecr get-login-password --region us-east-1)"
- docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t live -f docker/live/Dockerfile .
- docker login -u AWS -p $AWS_PASSWORD xxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com
- docker tag live:latest xxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/live:latest
- docker push xxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/live:latest
- mv docker/Dockerrun.aws.json Dockerrun.aws.json
- echo Pushing the Docker image...
- echo Writing image definitions file...
- printf '[{"name":"live","imageUri":"%s"}]' xxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/live:latest > imagedefinitions.json
故障错误消息为:
[Container] 2020/11/09 00:19:02 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t live -f docker/live/Dockerfile .. Reason: exit status 125
我做错了什么让dockerx工作?
看起来buildx
未安装或未启用。您必须在守护进程和cli中启用实验性功能。文档中说它与19.03捆绑在一起,但显然有些发行版不包括它,而且它仍然需要安装。我在文档中找不到下面的信息,我不得不通过搜索和试错将其拼凑在一起。
我在这个问题中找到的对我有效的步骤:
wget https://github.com/docker/buildx/releases/download/v0.5.1/buildx-v0.5.1.linux-amd64
chmod a+x buildx-v0.5.1.linux-amd64
mkdir -p ~/.docker/cli-plugins
mv buildx-v0.5.1.linux-amd64 ~/.docker/cli-plugins/docker-buildx
cat <<EOF >~/.docker/config.json
{
"experimental": "enabled"
}
EOF
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"experimental": true
}
EOF
sudo systemctl restart docker
docker buildx create --use
注:
- 当你们中的许多人读到这篇文章时,可能会有一个更新的版本发布。请查看GitHub上的版本
- 该片段将覆盖
/etc/docker/daemon.json
和~/.docker/config.json
中的任何现有内容。您可能需要检查这些文件是否已经不存在
我不熟悉CodePipelines,但我希望这些步骤或一些衍生步骤能让你摆脱困境。
为了测试这一点,我从一个新的Ubuntu 20.04安装中运行了以下程序:
sudo apt update
sudo apt install -y docker.io
sudo usermod -a -G docker ubuntu
logout
下一次再次登录并运行上面代码段中的命令。
cat <<EOF >Dockerfile
FROM ubuntu
RUN arch && sleep 10
EOF
docker buildx build --platform linux/arm64,linux/amd64 .
ubuntu@ip-172-31-94-5:~$ docker buildx build --platform linux/arm64,linux/amd64 .
WARN[0000] No output specified for docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load
[+] Building 5.9s (6/8)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 70B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [linux/amd64 internal] load metadata for docker.io/library/ubuntu:latest 1.9s
=> [linux/arm64 internal] load metadata for docker.io/library/ubuntu:latest 1.2s
=> [linux/amd64 1/2] FROM docker.io/library/ubuntu@sha256:c95a8e48bf88e9849f3e0f723d9f49fa12c5a00cfc6e60d2bc99d87555295e4c 1.0s
=> => resolve docker.io/library/ubuntu@sha256:c95a8e48bf88e9849f3e0f723d9f49fa12c5a00cfc6e60d2bc99d87555295e4c 0.0s
=> => sha256:2c2d948710f21ad82dce71743b1654b45acb5c059cf5c19da491582cef6f2601 162B / 162B 0.0s
=> => sha256:14428a6d4bcdba49a64127900a0691fb00a3f329aced25eb77e3b65646638f8d 847B / 847B 0.1s
=> => sha256:da7391352a9bb76b292a568c066aa4c3cbae8d494e6a3c68e3c596d34f7c75f8 28.56MB / 28.56MB 0.3s
=> => extracting sha256:da7391352a9bb76b292a568c066aa4c3cbae8d494e6a3c68e3c596d34f7c75f8 0.6s
=> => extracting sha256:14428a6d4bcdba49a64127900a0691fb00a3f329aced25eb77e3b65646638f8d 0.0s
=> => extracting sha256:2c2d948710f21ad82dce71743b1654b45acb5c059cf5c19da491582cef6f2601 0.0s
=> [linux/arm64 1/2] FROM docker.io/library/ubuntu@sha256:c95a8e48bf88e9849f3e0f723d9f49fa12c5a00cfc6e60d2bc99d87555295e4c 1.0s
=> => resolve docker.io/library/ubuntu@sha256:c95a8e48bf88e9849f3e0f723d9f49fa12c5a00cfc6e60d2bc99d87555295e4c 0.0s
=> => sha256:e9c66f1fb5a2d6587841797a3b0d4c2d0fd0b7ccd867e55a1314cee2e90ad47d 848B / 848B 0.0s
=> => sha256:94362ba2c285844f83a1b1e2dac5217b0426427f8bb809af534b5f4d751e298c 188B / 188B 0.1s
=> => sha256:a970164f39c1a46f71b3615bc9d5b6710832766b530d9179db8e36563f705abb 27.17MB / 27.17MB 0.4s
=> => extracting sha256:a970164f39c1a46f71b3615bc9d5b6710832766b530d9179db8e36563f705abb 0.5s
=> => extracting sha256:e9c66f1fb5a2d6587841797a3b0d4c2d0fd0b7ccd867e55a1314cee2e90ad47d 0.0s
=> => extracting sha256:94362ba2c285844f83a1b1e2dac5217b0426427f8bb809af534b5f4d751e298c 0.0s
=> [linux/amd64 2/2] RUN arch && sleep 10 2.8s
=> => # x86_64
=> [linux/arm64 2/2] RUN arch && sleep 10 2.7s
=> => # aarch64