From f23078df1c23d72c06fdae5de825164aca658ffa Mon Sep 17 00:00:00 2001 From: Nicolas Dorier Date: Fri, 22 Dec 2023 14:23:04 +0900 Subject: [PATCH] Use buildx for creating and pushing docker images (#5592) --- .circleci/config.yml | 98 ++++------------------------------ amd64.Dockerfile => Dockerfile | 2 +- arm32v7.Dockerfile | 45 ---------------- arm64v8.Dockerfile | 46 ---------------- btcpayserver.sln | 4 +- 5 files changed, 12 insertions(+), 183 deletions(-) rename amd64.Dockerfile => Dockerfile (94%) delete mode 100644 arm32v7.Dockerfile delete mode 100644 arm64v8.Dockerfile diff --git a/.circleci/config.yml b/.circleci/config.yml index 4dc90c0fd..5df734e32 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -31,79 +31,23 @@ jobs: - run: command: | curl -X POST -H "Authorization: token $GH_PAT" -H "Accept: application/vnd.github.everest-preview+json" -H "Content-Type: application/json" https://api.github.com/repos/btcpayserver/btcpayserver-doc/dispatches --data '{"event_type": "build_docs"}' - # publish jobs require $DOCKERHUB_REPO, $DOCKERHUB_USER, $DOCKERHUB_PASS defined - amd64: - machine: - image: ubuntu-2004:202111-02 + docker: + docker: + - image: cimg/base:stable steps: + - setup_remote_docker - checkout - run: command: | LATEST_TAG=${CIRCLE_TAG:1} #trim v from tag GIT_COMMIT=$(git rev-parse HEAD) # - sudo docker build --build-arg GIT_COMMIT=${GIT_COMMIT} --pull -t $DOCKERHUB_REPO:$LATEST_TAG-amd64 -f amd64.Dockerfile . - sudo docker build --build-arg GIT_COMMIT=${GIT_COMMIT} --pull --build-arg CONFIGURATION_NAME=Altcoins-Release -t $DOCKERHUB_REPO:$LATEST_TAG-altcoins-amd64 -f amd64.Dockerfile . - sudo docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS - sudo docker push $DOCKERHUB_REPO:$LATEST_TAG-amd64 - sudo docker push $DOCKERHUB_REPO:$LATEST_TAG-altcoins-amd64 - - arm32v7: - machine: - image: ubuntu-2004:202111-02 - steps: - - checkout - - run: - command: | - sudo docker run --rm --privileged multiarch/qemu-user-static:register --reset - LATEST_TAG=${CIRCLE_TAG:1} #trim v from tag - GIT_COMMIT=$(git rev-parse HEAD) - # - sudo docker build --build-arg GIT_COMMIT=${GIT_COMMIT} --pull -t $DOCKERHUB_REPO:$LATEST_TAG-arm32v7 -f arm32v7.Dockerfile . - sudo docker build --build-arg GIT_COMMIT=${GIT_COMMIT} --pull --build-arg CONFIGURATION_NAME=Altcoins-Release -t $DOCKERHUB_REPO:$LATEST_TAG-altcoins-arm32v7 -f arm32v7.Dockerfile . - sudo docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS - sudo docker push $DOCKERHUB_REPO:$LATEST_TAG-arm32v7 - sudo docker push $DOCKERHUB_REPO:$LATEST_TAG-altcoins-arm32v7 - - arm64v8: - machine: - image: ubuntu-2004:202111-02 - steps: - - checkout - - run: - command: | - sudo docker run --rm --privileged multiarch/qemu-user-static:register --reset - LATEST_TAG=${CIRCLE_TAG:1} #trim v from tag - GIT_COMMIT=$(git rev-parse HEAD) - # - sudo docker build --build-arg GIT_COMMIT=${GIT_COMMIT} --pull -t $DOCKERHUB_REPO:$LATEST_TAG-arm64v8 -f arm64v8.Dockerfile . - sudo docker build --build-arg GIT_COMMIT=${GIT_COMMIT} --build-arg CONFIGURATION_NAME=Altcoins-Release --pull -t $DOCKERHUB_REPO:$LATEST_TAG-altcoins-arm64v8 -f arm64v8.Dockerfile . - sudo docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS - sudo docker push $DOCKERHUB_REPO:$LATEST_TAG-arm64v8 - sudo docker push $DOCKERHUB_REPO:$LATEST_TAG-altcoins-arm64v8 - - multiarch: - machine: - image: ubuntu-2004:202201-02 - steps: - - run: - command: | - sudo docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS - # - LATEST_TAG=${CIRCLE_TAG:1} #trim v from tag - sudo docker manifest create --amend $DOCKERHUB_REPO:$LATEST_TAG $DOCKERHUB_REPO:$LATEST_TAG-amd64 $DOCKERHUB_REPO:$LATEST_TAG-arm32v7 $DOCKERHUB_REPO:$LATEST_TAG-arm64v8 - sudo docker manifest annotate $DOCKERHUB_REPO:$LATEST_TAG $DOCKERHUB_REPO:$LATEST_TAG-amd64 --os linux --arch amd64 - sudo docker manifest annotate $DOCKERHUB_REPO:$LATEST_TAG $DOCKERHUB_REPO:$LATEST_TAG-arm32v7 --os linux --arch arm --variant v7 - sudo docker manifest annotate $DOCKERHUB_REPO:$LATEST_TAG $DOCKERHUB_REPO:$LATEST_TAG-arm64v8 --os linux --arch arm64 --variant v8 - sudo docker manifest push $DOCKERHUB_REPO:$LATEST_TAG -p - - sudo docker manifest create --amend $DOCKERHUB_REPO:$LATEST_TAG-altcoins $DOCKERHUB_REPO:$LATEST_TAG-altcoins-amd64 $DOCKERHUB_REPO:$LATEST_TAG-altcoins-arm32v7 $DOCKERHUB_REPO:$LATEST_TAG-altcoins-arm64v8 - sudo docker manifest annotate $DOCKERHUB_REPO:$LATEST_TAG-altcoins $DOCKERHUB_REPO:$LATEST_TAG-altcoins-amd64 --os linux --arch amd64 - sudo docker manifest annotate $DOCKERHUB_REPO:$LATEST_TAG-altcoins $DOCKERHUB_REPO:$LATEST_TAG-altcoins-arm32v7 --os linux --arch arm --variant v7 - sudo docker manifest annotate $DOCKERHUB_REPO:$LATEST_TAG-altcoins $DOCKERHUB_REPO:$LATEST_TAG-altcoins-arm64v8 --os linux --arch arm64 --variant v8 - sudo docker manifest push $DOCKERHUB_REPO:$LATEST_TAG-altcoins -p - + docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS + docker buildx create --use + DOCKER_BUILDX_OPTS="--platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg GIT_COMMIT=${GIT_COMMIT} --push" + docker buildx build $DOCKER_BUILDX_OPTS -t $DOCKERHUB_REPO:$LATEST_TAG . + docker buildx build $DOCKER_BUILDX_OPTS -t $DOCKERHUB_REPO:$LATEST_TAG-altcoins --build-arg CONFIGURATION_NAME=Altcoins-Release . workflows: version: 2 build_and_test: @@ -120,7 +64,7 @@ workflows: # only act on version tags tags: only: /(v[1-9]+(\.[0-9]+)*(-[a-z0-9-]+)?)|(v[a-z0-9-]+)/ - - amd64: + - docker: filters: # ignore any commit on any branch by default branches: @@ -130,25 +74,3 @@ workflows: # OR features on specific versions like v1.0.0.88-lndseedbackup-1 tags: only: /(v[1-9]+(\.[0-9]+)*(-[a-z0-9-]+)?)|(v[a-z0-9-]+)/ - - arm32v7: - filters: - branches: - ignore: /.*/ - tags: - only: /(v[1-9]+(\.[0-9]+)*(-[a-z0-9-]+)?)|(v[a-z0-9-]+)/ - - arm64v8: - filters: - branches: - ignore: /.*/ - tags: - only: /(v[1-9]+(\.[0-9]+)*(-[a-z0-9-]+)?)|(v[a-z0-9-]+)/ - - multiarch: - requires: - - amd64 - - arm32v7 - - arm64v8 - filters: - branches: - ignore: /.*/ - tags: - only: /(v[1-9]+(\.[0-9]+)*(-[a-z0-9-]+)?)|(v[a-z0-9-]+)/ diff --git a/amd64.Dockerfile b/Dockerfile similarity index 94% rename from amd64.Dockerfile rename to Dockerfile index 9c5f0b171..d2e9b7dea 100644 --- a/amd64.Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.100-bookworm-slim AS builder +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0.100-bookworm-slim AS builder ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 WORKDIR /source COPY nuget.config nuget.config diff --git a/arm32v7.Dockerfile b/arm32v7.Dockerfile deleted file mode 100644 index 561ac19bb..000000000 --- a/arm32v7.Dockerfile +++ /dev/null @@ -1,45 +0,0 @@ -# Note that we are using buster rather than bullseye. Somehow, raspberry pi 4 doesn't like bullseye. -FROM mcr.microsoft.com/dotnet/sdk:8.0.100-bookworm-slim AS builder -ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 -RUN apt-get update \ - && apt-get install -qq --no-install-recommends qemu-system-arm qemu-user-static qemu-user binfmt-support - -WORKDIR /source -COPY nuget.config nuget.config -COPY Build/Common.csproj Build/Common.csproj -COPY BTCPayServer.Abstractions/BTCPayServer.Abstractions.csproj BTCPayServer.Abstractions/BTCPayServer.Abstractions.csproj -COPY BTCPayServer/BTCPayServer.csproj BTCPayServer/BTCPayServer.csproj -COPY BTCPayServer.Common/BTCPayServer.Common.csproj BTCPayServer.Common/BTCPayServer.Common.csproj -COPY BTCPayServer.Rating/BTCPayServer.Rating.csproj BTCPayServer.Rating/BTCPayServer.Rating.csproj -COPY BTCPayServer.Data/BTCPayServer.Data.csproj BTCPayServer.Data/BTCPayServer.Data.csproj -COPY BTCPayServer.Client/BTCPayServer.Client.csproj BTCPayServer.Client/BTCPayServer.Client.csproj -RUN cd BTCPayServer && dotnet restore -COPY BTCPayServer.Common/. BTCPayServer.Common/. -COPY BTCPayServer.Rating/. BTCPayServer.Rating/. -COPY BTCPayServer.Data/. BTCPayServer.Data/. -COPY BTCPayServer.Client/. BTCPayServer.Client/. -COPY BTCPayServer.Abstractions/. BTCPayServer.Abstractions/. -COPY BTCPayServer/. BTCPayServer/. -COPY Build/Version.csproj Build/Version.csproj -ARG CONFIGURATION_NAME=Release -ARG GIT_COMMIT -RUN cd BTCPayServer && dotnet publish -p:GitCommit=${GIT_COMMIT} --output /app/ --configuration ${CONFIGURATION_NAME} - -# Note that we are using buster rather than bullseye. Somehow, raspberry pi 4 doesn't like bullseye. -FROM mcr.microsoft.com/dotnet/aspnet:8.0.0-bookworm-slim-arm32v7 -COPY --from=builder /usr/bin/qemu-arm-static /usr/bin/qemu-arm-static -RUN apt-get update && apt-get install -y --no-install-recommends iproute2 openssh-client \ - && rm -rf /var/lib/apt/lists/* - -ENV LC_ALL en_US.UTF-8 -ENV LANG en_US.UTF-8 - -WORKDIR /datadir -WORKDIR /app -ENV BTCPAY_DATADIR=/datadir -ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 -VOLUME /datadir - -COPY --from=builder "/app" . -COPY docker-entrypoint.sh docker-entrypoint.sh -ENTRYPOINT ["/app/docker-entrypoint.sh"] diff --git a/arm64v8.Dockerfile b/arm64v8.Dockerfile deleted file mode 100644 index e69eda351..000000000 --- a/arm64v8.Dockerfile +++ /dev/null @@ -1,46 +0,0 @@ -# This is a manifest image, will pull the image with the same arch as the builder machine -FROM mcr.microsoft.com/dotnet/sdk:8.0.100-bookworm-slim AS builder -ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 -ENV LC_ALL en_US.UTF-8 -RUN apt-get update \ - && apt-get install -qq --no-install-recommends qemu-system-arm qemu-user-static qemu-user binfmt-support - -WORKDIR /source -COPY nuget.config nuget.config -COPY Build/Common.csproj Build/Common.csproj -COPY BTCPayServer.Abstractions/BTCPayServer.Abstractions.csproj BTCPayServer.Abstractions/BTCPayServer.Abstractions.csproj -COPY BTCPayServer/BTCPayServer.csproj BTCPayServer/BTCPayServer.csproj -COPY BTCPayServer.Common/BTCPayServer.Common.csproj BTCPayServer.Common/BTCPayServer.Common.csproj -COPY BTCPayServer.Rating/BTCPayServer.Rating.csproj BTCPayServer.Rating/BTCPayServer.Rating.csproj -COPY BTCPayServer.Data/BTCPayServer.Data.csproj BTCPayServer.Data/BTCPayServer.Data.csproj -COPY BTCPayServer.Client/BTCPayServer.Client.csproj BTCPayServer.Client/BTCPayServer.Client.csproj -RUN cd BTCPayServer && dotnet restore -COPY BTCPayServer.Common/. BTCPayServer.Common/. -COPY BTCPayServer.Rating/. BTCPayServer.Rating/. -COPY BTCPayServer.Data/. BTCPayServer.Data/. -COPY BTCPayServer.Client/. BTCPayServer.Client/. -COPY BTCPayServer.Abstractions/. BTCPayServer.Abstractions/. -COPY BTCPayServer/. BTCPayServer/. -COPY Build/Version.csproj Build/Version.csproj -ARG CONFIGURATION_NAME=Release -ARG GIT_COMMIT -RUN cd BTCPayServer && dotnet publish -p:GitCommit=${GIT_COMMIT} --output /app/ --configuration ${CONFIGURATION_NAME} - -# Force the builder machine to take make an arm runtime image. This is fine as long as the builder does not run any program -FROM mcr.microsoft.com/dotnet/aspnet:8.0.0-bookworm-slim-arm64v8 -COPY --from=builder /usr/bin/qemu-aarch64-static /usr/bin/qemu-aarch64-static -RUN apt-get update && apt-get install -y --no-install-recommends iproute2 openssh-client \ - && rm -rf /var/lib/apt/lists/* - -ENV LC_ALL en_US.UTF-8 -ENV LANG en_US.UTF-8 - -WORKDIR /datadir -WORKDIR /app -ENV BTCPAY_DATADIR=/datadir -ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 -VOLUME /datadir - -COPY --from=builder "/app" . -COPY docker-entrypoint.sh docker-entrypoint.sh -ENTRYPOINT ["/app/docker-entrypoint.sh"] diff --git a/btcpayserver.sln b/btcpayserver.sln index 1dc8a1900..b4c3f6030 100644 --- a/btcpayserver.sln +++ b/btcpayserver.sln @@ -10,14 +10,12 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{29290EC7-00E6-4C4B-96D9-4D7E9611DF28}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig - amd64.Dockerfile = amd64.Dockerfile - arm32v7.Dockerfile = arm32v7.Dockerfile - arm64v8.Dockerfile = arm64v8.Dockerfile Changelog.md = Changelog.md .github\codeql\codeql-config.yml = .github\codeql\codeql-config.yml Build\Common.csproj = Build\Common.csproj .circleci\config.yml = .circleci\config.yml docker-entrypoint.sh = docker-entrypoint.sh + Dockerfile = Dockerfile .circleci\run-tests.sh = .circleci\run-tests.sh Build\Version.csproj = Build\Version.csproj EndProjectSection