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

标签 go docker

我正在尝试构建一个包含 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,它也有效。

草稿图像是否有任何我不知道的限制?

最佳答案

对于临时镜像,不会有 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/

关于go - 在 docker 容器中生成一个新进程,该进程是从头开始构建的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42221207/

相关文章:

docker - Hortonworks HDP docker如何公开端口

go - 解析 plist xml

GOPATH 变量不持久

go - 如何访问模板范围内的 session 变量?

linux - 为什么 sh 找不到绑定(bind)安装在 docker 容器中的可执行文件

docker - 如何设置DOCKER_HOST?

php - “Error: mysqli_connect() No Such File or Directory”。 PHP 7 FPM,MariaDB,Nginx,Docker

sockets - 在 Go 中实现 ICMP ping

performance - Golang-常量和常量之间的性能差异

c# - 在 Docker 中获取文件