I’m attempting to build images for ARM32/64 with Automated Builds. I’ve set up binfmt support in my hooks/ directory:
# ls hooks/* hooks/post_checkout hooks/pre_build # cat hooks/post_checkout #!/bin/bash apt-get update apt-get install -y curl binfmt-support # cat hooks/pre_build #!/bin/bash docker run --rm --privileged multiarch/qemu-user-static --reset
These run fine, and my containers get built without any exec format errors. However, the architecture is incorrect when the images finish building. Instead of being flagged as ARM64v8, for instance, the architecture shows up as AMD64. The build is done as part of a multi-step build. Here is the Dockerfile contents:
FROM golang:latest as build WORKDIR /go/src/github.com/myapp/myapp ENV CGO_ENABLED=0 ENV GO111MODULE=on ENV GOARCH=arm64 # cache depedency downloads COPY go.mod go.sum ./ RUN go mod download COPY . . # build RUN make build RUN touch /config.yaml FROM arm64v8/alpine WORKDIR /myapp COPY --from=multiarch/qemu-user-static /usr/bin/qemu-aarch64-static /usr/bin/ RUN apk --no-cache add ca-certificates COPY --from=build /go/src/github.com/myapp/myapp/bin/* /bin/ COPY --from=build /config.yaml /myapp/config.yaml
If I run
docker build -f Dockerfile.arm64v8 . locally or on a Xenial VM with current docker-ce, the architecture shows up correctly. I’m only seeing this issue with Docker Hub Automated Builds.
Is there an additional step that needs to be taken to keep the image architecture intact?