name: "docker: build latest container" on: push: tags: - '*' workflow_dispatch: {} permissions: contents: read jobs: build: runs-on: ubuntu-latest strategy: matrix: platform: [amd64, arm64, arm, 386] include: - platform: amd64 qemu: false - platform: arm64 qemu: true - platform: arm qemu: true - platform: 386 qemu: true steps: - name: Checkout uses: actions/checkout@v4 - name: Free Disk Space run: | echo "Available disk space before cleanup:" df -h # Remove pre-installed tools sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL # Clean package managers sudo apt-get clean sudo rm -rf /var/lib/apt/lists/* # Clean Docker aggressively sudo docker system prune -af --volumes # Clean Go cache if it exists [ -d ~/.cache/go-build ] && rm -rf ~/.cache/go-build || true [ -d /go/pkg ] && rm -rf /go/pkg || true echo "Available disk space after cleanup:" df -h - name: Docker meta id: docker_meta uses: docker/metadata-action@v5 with: images: | chrislusf/seaweedfs ghcr.io/chrislusf/seaweedfs tags: type=raw,value=latest labels: | org.opencontainers.image.title=seaweedfs org.opencontainers.image.description=SeaweedFS is a distributed storage system for blobs, objects, files, and data lake, to store and serve billions of files fast! org.opencontainers.image.vendor=Chris Lu - name: Set up QEMU if: matrix.qemu uses: docker/setup-qemu-action@v3 - name: Create BuildKit config run: | cat > /tmp/buildkitd.toml <&2 sleep $timeout timeout=$((timeout * 2)) fi attempt=$((attempt + 1)) done echo "Command failed after $max_attempts attempts" >&2 return $exit_code } # Use crane or skopeo to copy, fallback to docker if not available if command -v crane &> /dev/null; then echo "Using crane to copy..." retry_with_backoff crane copy ghcr.io/chrislusf/seaweedfs:latest chrislusf/seaweedfs:latest elif command -v skopeo &> /dev/null; then echo "Using skopeo to copy..." retry_with_backoff skopeo copy --all docker://ghcr.io/chrislusf/seaweedfs:latest docker://chrislusf/seaweedfs:latest else echo "Using docker buildx imagetools (pulling 4 images from Docker Hub)..." # Fallback: create manifest directly on Docker Hub (pulls from Docker Hub - rate limited) retry_with_backoff docker buildx imagetools create -t chrislusf/seaweedfs:latest \ ghcr.io/chrislusf/seaweedfs:latest-amd64 \ ghcr.io/chrislusf/seaweedfs:latest-arm64 \ ghcr.io/chrislusf/seaweedfs:latest-arm \ ghcr.io/chrislusf/seaweedfs:latest-386 fi