プライベートで開発しているアプリケーションのイメージをクロスコンパイルする必要性に駆られて(ローカルの開発環境と本番の環境でアーキテクチャが異なっていることが起因)対応したのでメモ。
Docker Desktopにはbuildxが標準で備わっているのでそちらを利用する。
buildxを使うことでマルチアーキテクチャ対応のイメージを簡単に作ることができる。
こんな感じのDockerfileがあったとする。(実際に使っているDockerfileなのだが..)
FROM --platform=$BUILDPLATFORM golang:1.20.0-alpine as builder
WORKDIR /go/gobel-api/app
ARG TARGETPLATFORM
ARG BUILDPLATFORM
ARG TARGETOS
ARG TARGETARCH
COPY . .
RUN apk update && \
apk upgrade && \
apk add --no-cache libc-dev gcc git openssh openssl bash
RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -o app
FROM --platform=$TARGETPLATFORM alpine
COPY --from=builder /go/gobel-api/app ./
ENTRYPOINT ["/app"]
環境変数については下記参照。 cf. https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/builder/
buildとpushはこんな感じ。platformは複数指定することができる。
// ビルダーインスタンスの作成
docker buildx create --name buildx-builder
docker buildx use buildx-builder
// ビルドしてdockerhubにpush
docker buildx build --no-cache --push --platform linux/amd64,linux/arm64 --file app/Dockerfile --tag bmfsan/gobel-api app/
MySQLのオフィシャルイメージがいつの間にかARMにも対応するようになっていた。 M1ユーザーは嬉しい。