Go 在docker容器中生成一个新进程,该进程的映像是从头开始构建的

Go 在docker容器中生成一个新进程,该进程的映像是从头开始构建的,go,docker,Go,Docker,我正在尝试构建一个包含2个可执行二进制文件的最小docker映像(从头开始)。两者都是用Go构建的二进制文件。入口点设置为第一个入口点。它获取图像上的一些数据,使用环境变量对其进行转换,启动执行第二个二进制文件的新进程,并将数据作为派生进程的输入 FROM scratch COPY bin /opt/my-app ENTRYPOINT ["/opt/my-app/first", "--run", "/opt/my-app/second"] 当我在我的Mac上建立这个图像时,一切都正常。但是当它

我正在尝试构建一个包含2个可执行二进制文件的最小docker映像(
从头开始
)。两者都是用Go构建的二进制文件。入口点设置为第一个入口点。它获取图像上的一些数据,使用环境变量对其进行转换,启动执行第二个二进制文件的新进程,并将数据作为派生进程的输入

FROM scratch
COPY bin /opt/my-app
ENTRYPOINT ["/opt/my-app/first", "--run", "/opt/my-app/second"]
当我在我的Mac上建立这个图像时,一切都正常。但是当它在运行linux的构建服务器上创建时,第一个进程无法启动第二个进程。它失败,错误为“fork/exec/opt/my-app/second:没有这样的文件或目录”。然而,“第二个”二进制文件确实存在。在这两种情况下,都使用docker engine 1.13.1

如果父映像从
scratch
更改为
debian:jessie
,它也可以工作


我不知道scratch映像是否有任何限制?

对于scratch映像,将不会有libc(或任何共享libs)。如果它在debian上运行良好,那么我怀疑二进制文件不是静态链接的,这是正常的默认值。试试CGO_ENABLED=0 go build-a-installsuffix此处所示的CGO

二进制文件是否静态链接?对于临时映像,将不会有libc(或任何共享lib)。如果它在debian上运行良好,那么我怀疑二进制文件不是静态链接的,这是正常的默认值。请尝试CGO_ENABLED=0转到build-a-installsuffix CGO,如图所示。感谢您的提示,设置CGO_ENABLED=0确实有帮助。如果你把它作为一个答案,我很乐意接受:)