给定一个二进制文件,使用goos=linux
和goarch=amd64
用Go编译,部署到基于Alpine:3.3
的docker
容器中,如果docker引擎主机是Ubuntu(15.10):
sh: /bin/artisan: not found
如果docker引擎主机是部署在Mac OS X上的VirtualBox VM中的BusyBox
(这是Alpine
)的基础,则相同的二进制文件(为相同的OS和arch编译)将运行良好。
如果容器基于一个Ubuntu图像,这个二进制文件也可以运行得很好。
知道这个二进制缺少什么吗?
➜ 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
默认情况下,如果使用net
包,构建可能会生成带有某种动态链接的二进制文件,例如到libc。您可以通过查看LDD output.bin
的结果来动态检查还是静态检查链接
我遇到了两个解决方案:
cgo_enabled=0
Go build-tags netgo-a-v
,这是为特定平台实现的默认情况下,net包需要cgo,因为主机操作系统通常必须中介网络调用设置。不过,在某些系统上,可以使用没有cgo的网络,而且这样做很有用,例如,可以避免动态链接。新的构建标记netgo(默认为off)允许在那些可能的系统上以纯Go构建一个net包。
上面假设唯一的CGO依赖项是标准库的net
包。
问题内容: 给定一个二进制文件,使用Go使用and 编译该二进制文件,并将其部署到基于的容器中,如果Docker引擎主机为Ubuntu(15.10),则该二进制文件将不会运行: 如果将docker引擎主机(作为的基础)部署在Mac OS X上的VirtualBox VM中,则该相同的二进制文件(针对相同的OS和Arch编译)将 运行良好 。 如果容器基于Ubuntu映像之一,则同样的二进制文件也可
是否可以在其他具有Linux功能的ARM设备(如Raspberry Pi)上运行为Android构建的ARM二进制文件(而不是.apk)?我正在尝试将我的一个项目移植到ARM上,但我需要使用一个封闭源代码二进制(SopCast),它仅适用于x86(Windows和Linux)和(最近)Android设备。 运行显示ELF 32位LSB可执行文件,ARM,版本1(SYSV),动态链接(使用共享库),
问题内容: 是否有可能编译项目在 32位 与和一对 64位 系统?可能是,但是我该怎么做呢? 当我以“无知”的方式尝试它时,没有设置任何参数/ flags / etc,只是设置在其中查找链接的库似乎忽略了它,而只查看名为 lib64的 子目录。 问题答案:
我在windows机器上用虚拟盒子管理器运行Ubuntu。在VM box ubuntu中,我正在运行一个python flask应用程序,它运行在http://localhost:5000上。 我尝试使用我使用获得的虚拟机盒IP访问Windows计算机上的虚拟机框本地主机URL。但它说: 我访问它的方式正确吗? 这是我的蟒蛇烧瓶代码:
问题内容: Docker对我来说在Mac上运行良好,但是我必须在VirtualBox(或Parallels或VMWare Fusion)中运行docker主机,因为Mac的内核不支持docker。 所以我尝试在Ubuntu桌面上设置应用程序和docker-compose- 本机地,其中docker客户端和docker主机都物理上运行在同一系统上。这可行,但是我正在运行的Docker容器无法写入已安
问题内容: Docker容器中有多个进程正在运行,它们的PID在容器名称空间中是隔离的,是否有办法找出Docker主机上的PID是什么? 例如,有一个Apache Web服务器在Docker容器中运行(我使用Docker Hub中的 Apache + PHP映像),而Apache在启动时会在容器内创建更多工作进程。这些工作进程实际上正在处理传入的请求。要查看这些进程,我在docker容器中运行: