From 6b634de6b28a4503814856b1213c1de9d0607621 Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Sun, 27 Feb 2022 13:03:37 +0100 Subject: [PATCH] [packaging] Use buildx for multi-arch Docker builds (#413) * update drone to create latest manifest * add .dockerignore file * use buildx for multi-arch builds see https://docs.docker.com/buildx/working-with-buildx/ * don't use RUN commands in Dockerfile this was breaking multi-arch builds --- .dockerignore | 9 +++++++++ .drone.yml | 9 +++++++-- .goreleaser.yml | 45 +++++++++++++++++++++++++++++++++++---------- Dockerfile | 26 ++++++++------------------ 4 files changed, 59 insertions(+), 30 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..0a1dd90cb --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +.github +cmd +docs +example +internal +scripts +test +testrig +vendor diff --git a/.drone.yml b/.drone.yml index cc4e27703..e131cb239 100644 --- a/.drone.yml +++ b/.drone.yml @@ -57,7 +57,12 @@ steps: - git fetch --tags - /go/dockerlogin.sh - goreleaser release --rm-dist --snapshot - - docker push superseriousbusiness/gotosocial:latest + - docker push superseriousbusiness/gotosocial:latest-armv6 && + - docker push superseriousbusiness/gotosocial:latest-armv7 + - docker push superseriousbusiness/gotosocial:latest-arm64v8 + - docker push superseriousbusiness/gotosocial:latest-amd64 + - docker manifest create superseriousbusiness/gotosocial:latest superseriousbusiness/gotosocial:latest-armv6 superseriousbusiness/gotosocial:latest-armv7 superseriousbusiness/gotosocial:latest-amd64 superseriousbusiness/gotosocial:latest-arm64v8 + - docker manifest push superseriousbusiness/gotosocial:latest when: event: include: @@ -144,6 +149,6 @@ steps: --- kind: signature -hmac: 0487be0a2c9224c20cf067f94b3a458227e8b5465198b2245266d17156355b98 +hmac: ea1a9c8fc0a872f43146651caeae4f724ca6a45c780456af5a1cbd093d9c51c5 ... diff --git a/.goreleaser.yml b/.goreleaser.yml index 6b24a2c75..5402f434c 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -39,6 +39,9 @@ builds: - amd64 - arm - arm64 + goarm: + - 6 + - 7 ignore: # build freebsd only for amd64 - goos: freebsd @@ -51,13 +54,14 @@ builds: dockers: # https://goreleaser.com/customization/docker/ - + use: buildx goos: linux goarch: amd64 image_templates: - # - "superseriousbusiness/{{ .ProjectName }}:latest" - "superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-amd64" + - "superseriousbusiness/{{ .ProjectName }}:latest-amd64" build_flag_templates: - - --platform=linux/amd64 + - "--platform=linux/amd64" - "--label=org.opencontainers.image.created={{.Date}}" - "--label=org.opencontainers.image.title={{.ProjectName}}" - "--label=org.opencontainers.image.revision={{.FullCommit}}" @@ -65,13 +69,14 @@ dockers: extra_files: - web - + use: buildx goos: linux goarch: arm64 image_templates: - # - "superseriousbusiness/{{ .ProjectName }}:latest" - "superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-arm64v8" + - "superseriousbusiness/{{ .ProjectName }}:latest-arm64v8" build_flag_templates: - - --platform=linux/arm64/v8 + - "--platform=linux/arm64/v8" - "--label=org.opencontainers.image.created={{.Date}}" - "--label=org.opencontainers.image.title={{.ProjectName}}" - "--label=org.opencontainers.image.revision={{.FullCommit}}" @@ -79,13 +84,31 @@ dockers: extra_files: - web - + use: buildx goos: linux goarch: arm + goarm: 6 image_templates: - # - "superseriousbusiness/{{ .ProjectName }}:latest" - - "superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-armv7" + - "superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-armv6" + - "superseriousbusiness/{{ .ProjectName }}:latest-armv6" build_flag_templates: - - --platform=linux/arm/v7 + - "--platform=linux/arm/v6" + - "--label=org.opencontainers.image.created={{.Date}}" + - "--label=org.opencontainers.image.title={{.ProjectName}}" + - "--label=org.opencontainers.image.revision={{.FullCommit}}" + - "--label=org.opencontainers.image.version={{.Version}}" + extra_files: + - web + - + use: buildx + goos: linux + goarch: arm + goarm: 7 + image_templates: + - "superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-armv7" + - "superseriousbusiness/{{ .ProjectName }}:latest-armv7" + build_flag_templates: + - "--platform=linux/arm/v7" - "--label=org.opencontainers.image.created={{.Date}}" - "--label=org.opencontainers.image.title={{.ProjectName}}" - "--label=org.opencontainers.image.revision={{.FullCommit}}" @@ -97,12 +120,14 @@ docker_manifests: image_templates: - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-amd64 - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-arm64v8 + - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-armv6 - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-armv7 - name_template: superseriousbusiness/{{ .ProjectName }}:latest image_templates: - - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-amd64 - - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-arm64v8 - - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-armv7 + - superseriousbusiness/{{ .ProjectName }}:latest-amd64 + - superseriousbusiness/{{ .ProjectName }}:latest-arm64v8 + - superseriousbusiness/{{ .ProjectName }}:latest-armv6 + - superseriousbusiness/{{ .ProjectName }}:latest-armv7 archives: # https://goreleaser.com/customization/archive/ - diff --git a/Dockerfile b/Dockerfile index b069b9830..a4beea7ec 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,7 @@ +# syntax=docker/dockerfile:1.3 + # bundle the admin webapp -FROM node:17.6.0-alpine3.15 AS admin_builder +FROM --platform=${BUILDPLATFORM} node:17.6.0-alpine3.15 AS admin_builder RUN apk update && apk upgrade --no-cache RUN apk add git @@ -9,28 +11,16 @@ WORKDIR /gotosocial-admin RUN npm install RUN node index.js -FROM alpine:3.15.0 AS executor -RUN apk update && apk upgrade --no-cache +FROM --platform=${TARGETPLATFORM} alpine:3.15.0 AS executor # copy over the binary from the first stage -RUN mkdir -p /gotosocial/storage -COPY gotosocial /gotosocial/gotosocial +COPY --chown=1000:1000 gotosocial /gotosocial/gotosocial # copy over the web directory with templates etc -COPY web /gotosocial/web +COPY --chown=1000:1000 web /gotosocial/web # copy over the admin directory -COPY --from=admin_builder /gotosocial-admin/public /gotosocial/web/assets/admin +COPY --chown=1000:1000 --from=admin_builder /gotosocial-admin/public /gotosocial/web/assets/admin -# make the gotosocial group and user -RUN addgroup -g 1000 gotosocial -RUN adduser -HD -u 1000 -G gotosocial gotosocial - -# give ownership of the gotosocial dir to the new user -RUN chown -R gotosocial gotosocial /gotosocial - -# become the user -USER gotosocial - -WORKDIR /gotosocial +WORKDIR "/gotosocial" ENTRYPOINT [ "/gotosocial/gotosocial", "server", "start" ]