The `golang` container image sets the GOPATH directory to /go and the working directory to /go too. Following GOPATH layout, source code is expected to be in directories under /go/src. `/go/bin` is where binaries are installed by default, and `/go/pkg` include things like the module cache. With modules, it is entirely possible to work outside of the GOPATH (as you most likely are doing). In which case, a common pattern is to choose your own working directory, eg `WORKDIR /workspace` and work in there.
On Friday, February 11, 2022 at 7:51:00 PM UTC+1 davidmic...@gmail.com wrote: > I had earlier written a note about troubles refactoring my project to have > a "src" directory, but I've backed off on that for now. I see that the > main problem I saw with that hasn't changed when backing out those changes. > It appears that running this build inside a docker image seems to be > somehow causing this problem. > > In any case, I have a relatively simple go application with main.go, > go.mod, and go.sum in the root directory, with subdirectories containing > other source files in packages. > > When I just run "go build ..." from the command line in the root directory > of my project, it works fine and produces a working executable. > > However, I'm trying to get this build to work within a published go > "builder" image, which I will use as the first stage in a multi-stage > Docker build. > > I will first state that this has something to do with GOPATH, and I've > gone through > https://www.digitalocean.com/community/tutorials/understanding-the-gopath > , but I'd have to say that I still don't understand its proper role here. > > Not sure what you would want to see first, but here's a plain "ls" of the > root directory of my project: > ------------------------- > ./ Dockerfile go.mod Jenkinsfile README.md > ../ .dockerignore go.sum lib/ > target/ > app/ .git/ handlers/ main.go trustStore/ > config/ .gitignore include/ Makefile funcs/ > ----------------------- > > Just running "make build" does this: > --------------------- > CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o > ../target/dist/linux-amd64 > --------------------- > > Which is fine. > > My "dockerbuild" target in the Makefile is this: > -------------------- > dockerbuild: > docker build \ > --build-arg host_src_path=. \ > --build-arg packages=. \ > --build-arg executable_name=appgo \ > --build-arg cgo_enabled_01=1 \ > --build-arg goos=linux \ > --build-arg goarch=amd64 \ > -f Dockerfile -t appgo . > ----------------------- > > My Dockerfile, before the start of the second build stage, is this: > ---------------------------- > FROM .../golang:1.17.6-bullseye as go-builder > > ARG packages > ARG executable_name > ARG host_src_path > ARG cgo_enabled_01 > ARG goos > ARG goarch > > COPY $host_src_path . > RUN env > RUN ls -lt > RUN ls -lt $GOPATH > #RUN go mod download > > RUN CGO_ENABLED=$cgo_enabled_01 GOOS=$goos GOARCH=$goarch go build > -o $executable_name $packages > -------------------- > > When I run "make dockerbuild", I see this: > ------------------ > Sending build context to Docker daemon 125.8MB > Step 1/19 : FROM .../golang:1.17.6-bullseye as go-builder > ---> 80d9a75ccb38 > Step 2/19 : ARG packages > ---> Using cache > ---> d98015e225b1 > Step 3/19 : ARG executable_name > ---> Using cache > ---> 1d336ac5cf1b > Step 4/19 : ARG host_src_path > ---> Using cache > ---> 59595b09a376 > Step 5/19 : ARG cgo_enabled_01 > ---> Using cache > ---> 3c4c08392ede > Step 6/19 : ARG goos > ---> Using cache > ---> 6ed0d6881fb4 > Step 7/19 : ARG goarch > ---> Using cache > ---> 9e4b94e86b09 > Step 8/19 : COPY $host_src_path . > ---> 4727e2fc3e80 > Step 9/19 : RUN env > ---> Running in 8fcedaa86227 > HOSTNAME=8fcedaa86227 > HOME=/root > packages=. > cgo_enabled_01=1 > goarch=amd64 > host_src_path=. > > PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin > goos=linux > GOPATH=/go > executable_name=appgo > PWD=/go > GOLANG_VERSION=1.17.6 > Removing intermediate container 8fcedaa86227 > ---> 46e44a5a3539 > Step 10/19 : RUN ls -lt > ---> Running in 75107286d337 > total 128 > -rw-rw-r-- 1 root root 635 Feb 11 18:37 Dockerfile > -rw-rw-r-- 1 root root 737 Feb 11 18:29 Makefile > -rw-rw-r-- 1 root root 131 Feb 10 18:59 Jenkinsfile > drwxrwxrwx 2 root root 4096 Jan 27 10:09 bin > drwxrwxrwx 2 root root 4096 Jan 27 10:09 src > -rw-rw-r-- 1 root root 967 Jan 13 18:34 main.go > drwxrwxr-x 3 root root 4096 Jan 11 23:46 target > drwxrwxr-x 2 root root 4096 Jan 11 23:46 funcs > drwxrwxr-x 3 root root 4096 Jan 11 21:06 trustStore > -rw-rw-r-- 1 root root 1454 Jan 11 21:06 README.md > drwxrwxr-x 2 root root 4096 Jan 11 21:06 app > drwxrwxr-x 2 root root 4096 Jan 11 21:06 config > -rw-rw-r-- 1 root root 806 Jan 11 21:06 go.mod > -rw-rw-r-- 1 root root 65194 Jan 11 21:06 go.sum > drwxrwxr-x 2 root root 4096 Jan 11 21:06 handlers > drwxrwxr-x 3 root root 4096 Jan 11 21:06 include > drwxrwxr-x 4 root root 4096 Jan 11 21:06 lib > Removing intermediate container 75107286d337 > ---> a880f28ef2b2 > Step 11/19 : RUN ls -lt $GOPATH > ---> Running in 220d4e8dbb33 > total 128 > -rw-rw-r-- 1 root root 635 Feb 11 18:37 Dockerfile > -rw-rw-r-- 1 root root 737 Feb 11 18:29 Makefile > -rw-rw-r-- 1 root root 131 Feb 10 18:59 Jenkinsfile > drwxrwxrwx 2 root root 4096 Jan 27 10:09 bin > drwxrwxrwx 2 root root 4096 Jan 27 10:09 src > -rw-rw-r-- 1 root root 967 Jan 13 18:34 main.go > drwxrwxr-x 3 root root 4096 Jan 11 23:46 target > drwxrwxr-x 2 root root 4096 Jan 11 23:46 funcs > drwxrwxr-x 3 root root 4096 Jan 11 21:06 trustStore > -rw-rw-r-- 1 root root 1454 Jan 11 21:06 README.md > drwxrwxr-x 2 root root 4096 Jan 11 21:06 app > drwxrwxr-x 2 root root 4096 Jan 11 21:06 config > -rw-rw-r-- 1 root root 806 Jan 11 21:06 go.mod > -rw-rw-r-- 1 root root 65194 Jan 11 21:06 go.sum > drwxrwxr-x 2 root root 4096 Jan 11 21:06 handlers > drwxrwxr-x 3 root root 4096 Jan 11 21:06 include > drwxrwxr-x 4 root root 4096 Jan 11 21:06 lib > Removing intermediate container 220d4e8dbb33 > ---> 76c8e73bc8e8 > Step 12/19 : RUN CGO_ENABLED=$cgo_enabled_01 GOOS=$goos > GOARCH=$goarch go build -o $executable_name $packages > ---> Running in 28a92ca3224d > $GOPATH/go.mod exists but should not > The command '/bin/sh -c CGO_ENABLED=$cgo_enabled_01 GOOS=$goos > GOARCH=$goarch go build -o $executable_name $packages' returned a non-zero > code: 1 > make: *** [Makefile:11: dockerbuild] Error 1 > -------------------- > > There are a few things to note here, starting with the error message at > the end: > ------------------ > $GOPATH/go.mod exists but should not > ------------------ > > Outside of my Docker container, $GOPATH is basically ~/go, and it just > contains directories "bin" and "pkg". However, inside the container, > $GOPATH has all the code for my project, including the "go.mod" file, so at > least the first part of that error message is accurate, but I don't > understand the significance of that, or what I'm supposed to do to resolve > this. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/db777eaa-1116-4df0-a4be-2c07ad20bab4n%40googlegroups.com.