-
Notifications
You must be signed in to change notification settings - Fork 8.1k
docs: use bind mounts in Go Dockerfile examples #22388
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
✅ Deploy Preview for docsdocker ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
UPDATE: I have removed the
Using the https://github.com/github/github-mcp-server Go application as an example below. Size of Size of Running |
ad5ded2 to
cf728b4
Compare
|
Hi @aevesdocker @crazy-max, when you have a moment, could you take a quick look at this PR and let me know if it would be a worthwhile improvement to the documentation? Thanks 😊 |
thaJeztah
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like I wrote some comments last week, but didn't submit them 🙈
| FROM golang:1.21.1-alpine as base-build | ||
| WORKDIR /build | ||
| RUN go env -w GOMODCACHE=/root/.cache/go-build |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wondering if this one would still be useful; the default would be ~/.cache/go-build, but as the mounts are hard-coded to a location, it could be useful to explicitly configure go to use a location (for the mounts).
Possibly it could be a custom path so that the cache-directory can be set up to a predictable location for situations where you want to run the build as a user (USER) that's not root 🤔
| RUN go env -w GOMODCACHE=/root/.cache/go-build | ||
| COPY go.mod go.sum ./ | ||
| RUN --mount=type=cache,target=/root/.cache/go-build go mod download |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Perhaps @crazy-max or @tonistiigi have ideas on this part; yes, it looks like go mod download may download more; but it could depend on the situation; i.e., if all modules are downloaded, then possibly the cache could be re-used for multiple stages (instead of each stage downloading "just" the parts it needs).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For projects that don't vendor the dependencies this command is still useful so we should keep it imo.
the cache could be re-used for multiple stages (instead of each stage downloading "just" the parts it needs).
For multi-stage but also if doing a multiplatform build it will download it once similar to https://github.com/docker/compose/blob/6a2d16bd106bd84065e790b5c2b111509e8a6fd9/Dockerfile#L50-L54
| COPY go.mod go.sum ./ | ||
| RUN --mount=type=cache,target=/root/.cache/go-build go mod download | ||
| COPY ./src ./ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also double-checking with @crazy-max and @tonistiigi on this one; i.e., if copying the source was intentional here (restoring cache or otherwise?).
These are always tricky as there's no "single" rule, some bits may depend on your situation.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't recall for sure but I believe that I might've opted for COPY just to simplify the syntax on this page - it's specifically about cache mounts, so I probably wanted to make everything else as simple as possible. But the obvious downside of that is that we don't show the "optimal" pattern of bind mounting, which lead to this PR being raised.
I appreciate that it's easier to have all the best practices shown in the same example so I'm happy to get this in!
| RUN go env -w GOMODCACHE=/root/.cache/go-build | ||
| COPY go.mod go.sum ./ | ||
| RUN --mount=type=cache,target=/root/.cache/go-build go mod download |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For projects that don't vendor the dependencies this command is still useful so we should keep it imo.
the cache could be re-used for multiple stages (instead of each stage downloading "just" the parts it needs).
For multi-stage but also if doing a multiplatform build it will download it once similar to https://github.com/docker/compose/blob/6a2d16bd106bd84065e790b5c2b111509e8a6fd9/Dockerfile#L50-L54
Reference: docker#22388 (review) Signed-off-by: Eng Zer Jun <[email protected]>
|
Hi @thaJeztah and @crazy-max, It's been a while. I wanted to follow up on this PR since I addressed the previous review comments. Is there anything else I should do from my side, or do you think the PR is ready for the next review round/merge? Thank you! |
Signed-off-by: Eng Zer Jun <[email protected]>
`go build` will automatically download module dependencies. In many cases, that is a much smaller set of modules than what is downloaded by `go mod download`. Using the https://github.com/github/github-mcp-server Go application as an example below. Size of GOMODCACHE with `go mod download`: $ go clean -i -r -cache -modcache $ go mod download $ du -sh ~/go/pkg/mod 186M /home/jun/go/pkg/mod Size of GOMODCACHE with `go build`: $ go clean -i -r -cache -modcache $ CGO_ENABLED=0 go build -ldflags="-s -w" cmd/github-mcp-server/main.go go: downloading github.com/spf13/viper v1.20.1 go: downloading github.com/mark3labs/mcp-go v0.18.0 go: downloading github.com/google/go-github/v69 v69.2.0 go: downloading github.com/sirupsen/logrus v1.9.3 go: downloading github.com/spf13/cobra v1.9.1 go: downloading golang.org/x/sys v0.31.0 go: downloading github.com/spf13/afero v1.14.0 go: downloading github.com/fsnotify/fsnotify v1.8.0 go: downloading github.com/spf13/cast v1.7.1 go: downloading github.com/go-viper/mapstructure/v2 v2.2.1 go: downloading github.com/subosito/gotenv v1.6.0 go: downloading gopkg.in/yaml.v3 v3.0.1 go: downloading github.com/spf13/pflag v1.0.6 go: downloading github.com/pelletier/go-toml/v2 v2.2.3 go: downloading github.com/sagikazarmark/locafero v0.9.0 go: downloading golang.org/x/text v0.23.0 go: downloading github.com/google/uuid v1.6.0 go: downloading github.com/yosida95/uritemplate/v3 v3.0.2 go: downloading github.com/sourcegraph/conc v0.3.0 go: downloading github.com/google/go-querystring v1.1.0 $ du -sh ~/go/pkg/mod 80M /home/jun/go/pkg/mod Reference: https://stackoverflow.com/a/68172023/7902371 Signed-off-by: Eng Zer Jun <[email protected]>
Reference: docker#22388 (review) Signed-off-by: Eng Zer Jun <[email protected]>
Signed-off-by: Eng Zer Jun <[email protected]>
a391c8e to
0ddf9cf
Compare
dvdksn
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM thank you @Juneezee
Description
I remembered there used to be a page (https://docs.docker.com/build/guide/mounts/) that demonstrated how to use both bind mounts and cache mounts together in a Dockerfile for a Go application. However, that page was removed in #20715, and the new page (https://docs.docker.com/build/cache/optimize/) now separates the examples for bind mounts and cache mounts.
docs/content/build/guide/mounts.md
Lines 185 to 194 in 91b324f
It would be great if the remaining Go Dockerfile examples could show how to use both bind mounts and cache mounts together
specifically for(See #22388 (comment) for updtae)go.modandgo.sum. This combination was really helpful for improving build performance and clarity when using Docker for Go development.Related issues or tickets
Reviews