Using the attractively small alpine image as a base for dockerizing a Go web application on an Ubuntu host, does not work if the application binary is built using the traditional:
The image builds without a problem, but running a container:
results in the following error:
The reason behind this lies in the alpine OS missing dependencies that the Go application by default needs. In particular it is the Go net package, that by default requires cgo to enable dynamic runtime linking to C libraries, which the alpine does not provide.
a)
On some systems (like Ubuntu) it is possible to use the network without cgo, so we can use the the CGO_ENABLED flag to change the default:
GOOS=linux GOARCH=amd64 go build
FROM alpine:latest RUN mkdir /app WORKDIR /app COPY service /app EXPOSE 50051 ENTRYPOINT ["./service"]
The image builds without a problem, but running a container:
docker run -p 50051:50051 author-service
results in the following error:
standard_init_linux.go:178: exec user process caused "no such file or directory"
The reason behind this lies in the alpine OS missing dependencies that the Go application by default needs. In particular it is the Go net package, that by default requires cgo to enable dynamic runtime linking to C libraries, which the alpine does not provide.
SOLUTION
a)
On some systems (like Ubuntu) it is possible to use the network without cgo, so we can use the the CGO_ENABLED flag to change the default:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build .
b)
Alternatively it is possible to enforce using Go implementation of net dependencies, netgo:
GOOS=linux GOARCH=amd64 go build -tags netgo -a -v .
c)
If you for any reason don't want to use either of the above, just use debien instead of alpine.
No comments:
Post a Comment
Note: only a member of this blog may post a comment.