# syntax=docker/dockerfile:1 FROM golang:tip-alpine3.23 AS builder # Install git for module fetching RUN apk add --no-cache git WORKDIR /build # Cache dependencies first COPY go.mod go.sum ./ RUN go mod download # Copy the rest of the source COPY . . # Build the project RUN go build -trimpath -o leetcode-go ./... FROM alpine:3.18 # Install CA certificates for TLS RUN apk add --no-cache ca-certificates WORKDIR /root # Copy the binary from builder COPY --from=builder /build/leetcode-go /usr/local/bin/leetcode-go # Run the CLI by default ENTRYPOINT ["leetcode-go"] CMD []
# Exclude VCS and irrelevant files .git .github Dockerfile .dockerignore .tree website/public website/static website vendor node_modules **/*.log *.log *.tmp *.temp *.backup *.bak *.out *.exe *.dll *.so *.dylib *.test **/__pycache__/ **/*.o **/*.a files_to_ignore
- Failing step: [builder 5/7] RUN go mod download - Exact error message and exit code: go: github.com/halfrost/LeetCode-Go/ctl/models@v0.0.0-20220910225043-e3bb5aff34d0 (replaced by ./ctl/models): reading ctl/models/go.mod: open /build/ctl/models/go.mod: no such file or directory Exit code: 1 - Missing packages/files mentioned: - /build/ctl/models/go.mod (missing) - Local replacement path ./ctl/models referenced for the module (not present in the build context) - Version mismatch / replacement info: - The module github.com/halfrost/LeetCode-Go/ctl/models is shown as replaced by ./ctl/models, but the replacement path cannot be resolved because ./ctl/models is not available in the /build context. This suggests a misconfigured local replace in go.mod (or missing files that should accompany the local replace).
# syntax=docker/dockerfile:1 FROM golang:tip-alpine3.23 AS builder # Install git for module fetching RUN apk add --no-cache git ENV CGO_ENABLED=0 WORKDIR /build # Copy the entire repository so local module replacements resolve correctly COPY . . # Fetch dependencies RUN go mod download # Build the project RUN go build -trimpath -o leetcode-go ./... FROM alpine:3.18 # Install CA certificates for TLS RUN apk add --no-cache ca-certificates WORKDIR /root # Copy the binary from builder COPY --from=builder /build/leetcode-go /usr/local/bin/leetcode-go # Run the CLI by default ENTRYPOINT ["leetcode-go"] CMD []
Summary of Docker build error (preserving requested items)
- Exact error message and exit code
- go: cannot write multiple packages to non-directory leetcode-go
- exit code: 1
- Failing command/step
- [builder 6/6] RUN go build -trimpath -o leetcode-go ./...
- Missing packages or files mentioned
- No missing packages/files are mentioned in the error output.
- Version mismatch info
- Images involved in the build:
- golang:tip-alpine3.23
- alpine:3.18
- No explicit version mismatch is reported in the error log.
- Additional notes (root cause and quick fixes)
- Root cause: Building all packages in ./... while using -o leetcode-go writes to a non-directory path, which is invalid when multiple packages exist. Go cannot write multiple packages to a single non-directory file.
- Quick fixes:
- Build a single package and keep -o as a file, e.g. go build -trimpath -o leetcode-go ./cmd/yourpkg
- Or remove -o and build all packages: go build -trimpath ./...
- Or write to a directory (e.g., -o ./bin/leetcode-go) and ensure the directory exists (go cannot treat a file output as a directory automatically).# syntax=docker/dockerfile:1 FROM golang:1.19-alpine3.23 AS builder # Install git for module fetching RUN apk add --no-cache git ENV CGO_ENABLED=0 WORKDIR /build # Copy go.mod and go.sum first to leverage layer caching COPY go.mod go.sum ./ RUN go mod download # Copy the rest of the source COPY . . # Build the ctl main package (the CLI in this repo) RUN go build -trimpath -o leetcode-go ./ctl FROM alpine:3.18 # Install CA certificates for TLS RUN apk add --no-cache ca-certificates WORKDIR /root # Copy the binary from builder COPY --from=builder /build/leetcode-go /usr/local/bin/leetcode-go # Run the CLI by default ENTRYPOINT ["leetcode-go"] CMD []
# syntax=docker/dockerfile:1 FROM golang:1.19-alpine AS builder # Install git for module fetching RUN apk add --no-cache git ENV CGO_ENABLED=0 WORKDIR /build # Copy go.mod and go.sum first to leverage layer caching COPY go.mod go.sum ./ RUN go mod download # Copy the rest of the source COPY . . # Build the ctl main package (the CLI in this repo) RUN go build -trimpath -o leetcode-go ./ctl FROM alpine:3.18 # Install CA certificates for TLS RUN apk add --no-cache ca-certificates WORKDIR /root # Copy the binary from builder COPY --from=builder /build/leetcode-go /usr/local/bin/leetcode-go # Run the CLI by default ENTRYPOINT ["leetcode-go"] CMD []
- Exact error message and exit code - go: github.com/halfrost/LeetCode-Go/ctl/models@v0.0.0-20220910225043-e3bb5aff34d0 (replaced by ./ctl/models): reading ctl/models/go.mod: open /build/ctl/models/go.mod: no such file or directory - Exit code: 1 - Failing command/step - [builder 5/7] RUN go mod download - Missing packages or files mentioned - /build/ctl/models/go.mod (the local path replaced by ./ctl/models cannot be opened; the file is not present in the build context) - The module is replaced by a local path ./ctl/models, which is not available in the build context at /build - Version mismatch / replace info - Module replacement: github.com/halfrost/LeetCode-Go/ctl/models@v0.0.0-20220910225043-e3bb5aff34d0 (replaced by ./ctl/models) - This indicates a go.mod replace directive pointing to a local path, but the local path ./ctl/models is not present during the build - Related context - Dockerfile shows copying go.mod and go.sum, then running go mod download, which fails due to the missing local replace target.
# syntax=docker/dockerfile:1 FROM golang:tip-alpine3.23 AS builder # Install git for module fetching RUN apk add --no-cache git ENV CGO_ENABLED=0 WORKDIR /build # Copy the go.mod and go.sum first to leverage layer caching COPY go.mod go.sum ./ # We need the full repo because of local module replacements; copy all COPY . . # Fetch dependencies RUN go mod download # Build the project from sources; build the main CLI under ctl RUN go build -trimpath -o leetcode-go ./ctl FROM alpine:3.18 # Install CA certificates for TLS RUN apk add --no-cache ca-certificates WORKDIR /root # Copy the binary from builder COPY --from=builder /build/leetcode-go /usr/local/bin/leetcode-go # Run the CLI by default ENTRYPOINT ["leetcode-go"] CMD []
Concerns: Builder uses golang:tip-alpine3.23 which can lead to non-deterministic builds; pin a specific Go version for reproducibility., Relies on the CLI responding to --version or --help in smoke tests; if the project uses different flags, tests may need adjustment. Smoke [PASS]: test -x /usr/local/bin/leetcode-go Smoke [PASS]: /usr/local/bin/leetcode-go --version 2>&1 | head -n 1 Smoke [PASS]: /usr/local/bin/leetcode-go --help 2>&1 | head -n 1