Skip to content

Commit db3d8f7

Browse files
committed
Optimize Docker build with bind mounts
This commit further optimize the Docker builds on top of PR github#92 with: 1. Add .dockerignore file to exclude non-source code files [1]. 2. Use Alpine image variant for build stage to reduce download size. golang:1.23.7-alpine is 200 MB smaller than golang:1.23.7 [2][3]. 3. Replace COPY instruction with RUN --mount=type=bind. Bind mounts do not add unnecessary layers to the cache [4][5]. [1]: https://docs.docker.com/build-cloud/optimization/#dockerignore-files [2]: https://hub.docker.com/layers/library/golang/1.23.7-alpine/images/sha256-333d4ba78773b3a3ae9cf2cff8962df56effc5c9481faa355f211abf2baf175c [3]: https://hub.docker.com/layers/library/golang/1.23.7/images/sha256-2087a99c3235972660b3d35c1564d9d1a3f639dcace9c790acbabc7e938d1570 [4]: https://docs.docker.com/build/building/best-practices/#add-or-copy [5]: https://docs.docker.com/build/cache/optimize/#use-bind-mounts Signed-off-by: Eng Zer Jun <[email protected]>
1 parent 7145142 commit db3d8f7

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

.dockerignore

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
.github
2+
.vscode
3+
script
4+
third-party
5+
.dockerignore
6+
.gitignore
7+
**/*.yml
8+
**/*.yaml
9+
**/*.md
10+
**/*_test.go
11+
LICENSE

Dockerfile

+14-10
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,31 @@
1+
FROM golang:1.23.7-alpine AS build
12
ARG VERSION="dev"
23

3-
FROM golang:1.23.7 AS build
4-
# allow this step access to build arg
5-
ARG VERSION
64
# Set the working directory
75
WORKDIR /build
86

9-
RUN go env -w GOMODCACHE=/root/.cache/go-build
7+
# Install git
8+
RUN --mount=type=cache,target=/var/cache/apk \
9+
apk add git
1010

1111
# Install dependencies
12-
COPY go.mod go.sum ./
13-
RUN --mount=type=cache,target=/root/.cache/go-build go mod download
12+
RUN --mount=type=cache,target=/go/pkg/mod \
13+
--mount=type=bind,source=go.mod,target=go.mod \
14+
--mount=type=bind,source=go.sum,target=go.sum \
15+
go mod download
1416

15-
COPY . ./
1617
# Build the server
17-
RUN --mount=type=cache,target=/root/.cache/go-build CGO_ENABLED=0 go build -ldflags="-s -w -X main.version=${VERSION} -X main.commit=$(git rev-parse HEAD) -X main.date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
18-
-o github-mcp-server cmd/github-mcp-server/main.go
18+
RUN --mount=type=cache,target=/go/pkg/mod \
19+
--mount=type=cache,target=/root/.cache/go-build \
20+
--mount=type=bind,target=. \
21+
CGO_ENABLED=0 go build -ldflags="-s -w -X main.version=${VERSION} -X main.commit=$(git rev-parse HEAD) -X main.date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
22+
-o /bin/github-mcp-server cmd/github-mcp-server/main.go
1923

2024
# Make a stage to run the app
2125
FROM gcr.io/distroless/base-debian12
2226
# Set the working directory
2327
WORKDIR /server
2428
# Copy the binary from the build stage
25-
COPY --from=build /build/github-mcp-server .
29+
COPY --from=build /bin/github-mcp-server .
2630
# Command to run the server
2731
CMD ["./github-mcp-server", "stdio"]

0 commit comments

Comments
 (0)