我正在尝试构建包含2个可执行二进制文件的最小码头镜像(FROM scratch
)。两者都是用Go构建的二进制文件。入口点设置为第一个。它在图像上获取一些数据,使用环境变量对其进行转换,启动一个执行第二个二进制文件的新进程,并将数据作为生成进程的输入进行管道传输。在Docker容器中产生一个新的进程,从头开始构建镜像
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:没有这样的文件或目录”。但是,“秒”二进制确实存在。在这两种情况下都使用码头引擎1.13.1。
如果父图像从scratch
更改为debian:jessie
,它也可以使用。
我没有意识到刮痕图像有任何限制吗?
二进制文件是静态链接的吗?使用临时图像时,不会有libc(或任何共享库)。如果它在debian上正常工作,那么我怀疑二进制文件不是静态链接的,这是正常的默认设置。尝试CGO_ENABLED = 0去建立-a -installsuffix cgo,看看这里http://www.blang.io/posts/2015-04_golang-alpine-build-golang-binaries-for-alpine-linux/ – foo
感谢您的提示,设置CGO_ENABLED = 0确实有帮助。如果你把它作为答案发布,我会很乐意接受:) –