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.
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.