Skip to content

Install the docker buildx plugin with a builder to build arm containers #765

Closed
@nitrocode

Description

In order to start building containers for amd64 and arm (and additional platforms), it would be nice to pre-install the buildx binary.

Install buildx

# install docker buildx globally
DOCKER_DIR=/usr/libexec/docker
## get latest version or pin it to v0.4.2
BUILDX_VERSION=$(curl --silent "https://api.github.com/repos/docker/buildx/releases/latest" | jq -r '.tag_name')
mkdir -p $DOCKER_DIR/cli-plugins

## check architecture
UNAME_ARCH=`uname -m`
case $UNAME_ARCH in
  aarch64)
    BUILDX_ARCH="arm64";
    ;;
  amd64)
    BUILDX_ARCH="amd64";
    ;;
  *)
    BUILDX_ARCH="amd64";
    ;;
esac

wget \
  -O $DOCKER_DIR/cli-plugins/docker-buildx \
  -nv https://github.com/docker/buildx/releases/download/$BUILDX_VERSION/buildx-$BUILDX_VERSION.linux-$BUILDX_ARCH
chmod a+x $DOCKER_DIR/cli-plugins/docker-buildx

## Install in the buildkite-agent user
# install arm
runuser -l buildkite-agent -c 'docker run --privileged --rm tonistiigi/binfmt --install all'
# create docker builder
runuser -l buildkite-agent -c 'docker buildx create --platform linux/amd64,linux/arm64,linux/arm/v7 --name mybuilder --use'
runuser -l buildkite-agent -c 'docker buildx inspect --bootstrap'

Sanity check: SSH into buildkite ec2 instance

$ sudo su - buildkite-agent
$ docker buildx version
github.com/docker/buildx v0.4.2 fb7b670b764764dc4716df3eba07ffdae4cc47b2
$ docker buildx ls
NAME/NODE    DRIVER/ENDPOINT             STATUS  PLATFORMS
mybuilder *  docker-container
  mybuilder0 unix:///var/run/docker.sock running linux/amd64*, linux/arm64*, linux/arm/v7*, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v6
default      docker
  default    default                     running linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

While ssh'ed, test container creation

mkdir test
cd test
cat <<EOF > Dockerfile
FROM ubuntu
RUN uname -m
EOF
docker buildx build --platform linux/amd64,linux/arm64 . --progress plain

Which then returns the expected architectures

#8 [linux/amd64 2/2] RUN uname -m
#8 0.153 x86_64
#8 DONE 0.2s

#6 [linux/arm64 2/2] RUN uname -m
#6 0.200 aarch64
#6 DONE 0.3s

Source: docker/buildx#57 (comment)

Misc

  • EnableDockerUserNamespaceRemap=false should resolve this issue

    Error response from daemon: privileged mode is incompatible with user namespaces

    Related user namespace remap issue Document userns remapping #538

  • EnableDockerExperimental=true is mandatory for buildx

  • ECRAccessPolicy=poweruser is required for pushing containers to ecr

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions