如果一个二进制文件是使用 GOOS=linux
以及 GOARCH=amd64
编译的,在基于 alpine:3.3
的 docker
容器中运行,但如果 docker 引擎主机是 Ubuntu (15.10),该二进制文件将无法运行:
sh: /bin/artisan: not found
同样的二进制文件(针对相同的操作系统和架构编译)如果Docker引擎主机是在Mac OS X上部署的VirtualBox VM中的busybox(这是alpine的基础),则可以正常运行。如果容器基于Ubuntu镜像,则此相同的二进制文件也可以完美地运行。
有什么想法,这个二进制文件缺少了什么?
以下是我为了复制而做的事情(在OS X上的VirtualBox/busybox中成功运行未显示):
构建(即使架构匹配,也要显式使用标志进行构建):
➜ artisan git:(master) ✗ GOOS=linux GOARCH=amd64 go build
检查它能否在主机上运行:
➜ artisan git:(master) ✗ ./artisan
10:14:04.925 [ERROR] artisan: need a command, one of server, provision or build
复制到docker目录,构建,运行:
➜ artisan git:(master) ✗ cp artisan docker/build/bin/
➜ artisan git:(master) ✗ cd docker
➜ docker git:(master) ✗ cat Dockerfile
FROM docker:1.10
COPY build/ /
➜ docker git:(master) ✗ docker build -t artisan .
Sending build context to Docker daemon 10.15 MB
Step 1 : FROM docker:1.10
...
➜ docker git:(master) ✗ docker run -it artisan sh
/ # /bin/artisan
sh: /bin/artisan: not found
现在将镜像基础更改为
phusion/baseimage
:➜ docker git:(master) ✗ cat Dockerfile
#FROM docker:1.10
FROM phusion/baseimage
COPY build/ /
➜ docker git:(master) ✗ docker build -t artisan .
Sending build context to Docker daemon 10.15 MB
Step 1 : FROM phusion/baseimage
...
➜ docker git:(master) ✗ docker run -it artisan sh
# /bin/artisan
08:16:39.424 [ERROR] artisan: need a command, one of server, provision or build
go build -tags netgo -a -v std
,我认为这可能与net包有关,导致动态链接问题。 - Martin Gallagherldd output.bin
以查看每个构建变体是否真正静态编译,或者是否存在任何动态链接。 - Martin Gallagher