我正在尝试构建包含2个可执行二进制文件的最小docker镜像(FROM scratch
)。两者都是用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
,也可以使用。
我不知道刮痕图像有任何限制吗?
答案 0 :(得分:1)
使用临时图像时,不会有libc(或任何共享库)。如果它在debian上工作正常,那么我怀疑二进制文件没有静态链接,这是正常的默认值。尝试CGO_ENABLED = 0 go build -a -installsuffix cgo,如此处http://www.blang.io/posts/2015-04_golang-alpine-build-golang-binaries-for-alpine-linux/