记录一次Go打包Docker镜像的问题
在Linux环境下编译好Go源文件以后我尝试将最后的可执行文件复制到Docker镜像alpine
中。
这是一个最简单的Go Web代码
1 | package main |
以及对应的Dockerfile
1 | FROM alpine |
在最后运行容器时始终出现了file not found
的警告,容器一直启动失败,我尝试通过exec进入到容器内部查看文件,发现文件确实拷贝到了正确的位置,但是我在容器中无法使用./web
之类的方式启动。
那看来是可执行文件本身的问题,很快发现默认情况下Go编译处的可执行文件是需要动态链接,而alpine是一个相当轻量的Linux,其本身并不包括动态链接所需要的文件,所以我们要使用静态链接
找到问题之后我们只要静态编译即可
1 | CGO_ENABLED=0 go build -a -ldflags '-extldflags "-static"' . |
最后再次重新构建发现问题果然解决
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 jking の 博客!