在Alpine Linux Docker的路径中找不到已安装的Go二进制文件

I've got a Go binary I'm trying to run on the Alpine Docker image.

This works fine for the Docker Go binary.

docker run -it alpine:3.3 sh
apk add --no-cache curl

DOCKER_BUCKET=get.docker.com
DOCKER_VERSION=1.9.1
curl -fSL "https://${DOCKER_BUCKET}/builds/Linux/x86_64/docker-$DOCKER_VERSION" -o /usr/local/bin/docker
chmod +x /usr/local/bin/docker
docker help
Usage: docker [OPTIONS] COMMAND [arg...]
...

However, for the Go binary I want to install.

RACK_BUCKET=ec4a542dbf90c03b9f75-b342aba65414ad802720b41e8159cf45.ssl.cf5.rackcdn.com
RACK_VERSION=1.1.0-beta1
curl -fSL "https://${RACK_BUCKET}/${RACK_VERSION}/Linux/amd64/rack" -o /usr/local/bin/rack
chmod +x /usr/local/bin/rack

rack help
sh: rack: not found

/usr/local/bin/rack help
sh: /usr/local/bin/rack: not found

ls -al /usr/local/bin/
total 43375
drwxr-xr-x    2 root     root          1024 Jan 11 18:10 .
drwxr-xr-x    8 root     root          1024 Jan 11 18:09 ..
-rwxr-xr-x    1 root     root      30222575 Jan 11 18:09 docker
-rwxr-xr-x    1 root     root      14190576 Jan 11 18:10 rack

which rack
/usr/local/bin/rack

I thought it might have something to do with this answer but I don't get the same error when running ldd.

ldd /usr/local/bin/rack
    /lib64/ld-linux-x86-64.so.2 (0x7fdd15cd0000)
    libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7fdd15cd0000)
    libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fdd15cd0000)

Any idea with this installed Go binary is not found in path on Alpine Linux Docker?

duanjiancong4860
duanjiancong4860 感谢您的有用评论。我已经公开了静态链接机架二进制文件的问题。
4 年多之前 回复
douliu1092
douliu1092 ldd用于打印共享库依赖项,docker二进制文件是静态链接的。
4 年多之前 回复
douang2297
douang2297 另外,当我在容器中运行ldd/usr/local/bin/docker时,也会得到输出ldd:/usr/local/bin/docker:不是有效的动态程序
4 年多之前 回复
dovhpmnm31216
dovhpmnm31216 机架链接到gnulibc,高山使用musllibc。
4 年多之前 回复
douzhimei8259
douzhimei8259 在容器内运行ldd。ldd输出中列出的库文件在Alpine映像中不存在。
4 年多之前 回复
duanlie2709
duanlie2709 您是在主机上还是在高山容器中运行了ldd?您是否检查了ldd输出中列出的库文件在高山映像中是否确实存在?
4 年多之前 回复

5个回答

RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

Since the musl and glibc so are compatible, you can make this symlink and it will fix the missing dependency.

dql1978dql1978
dql1978dql1978 此答案不正确,因为这是一种解决方法。 正确的是Kuldeep的。 您需要使用CGO_ENABLED = 0选项编译程序
大约一年之前 回复
douwen3083
douwen3083 哇,太神奇了
一年多之前 回复
dongluo8439
dongluo8439 虽然这对我有用,但仍然是一种解决方法。 最后,我选择遵循Kuldeep的回答,并使用CGO_ENABLED = 0进行构建。 生成的二进制文件适用于Alpine。
大约 2 年之前 回复
dscrn1974
dscrn1974 将此行添加到Dockerfile中会产生以下错误#重新定位./my_go_binary时出错:__fprintf_chk:未找到符号。 似乎是C库之间的不兼容。 还有其他人收到此错误吗?
2 年多之前 回复
dongqin1167
dongqin1167 音乐可能是musl libc的错字
2 年多之前 回复
dongshanyan0322
dongshanyan0322 什么是肌肉? 在Google上找不到
3 年多之前 回复
dongyong1897
dongyong1897 已安装的Go版本是使用glibc编译的,并且是在默认未安装的Alpine上编译的。 您可以使用muslc编译Go语言,这是Alpine的默认设置,或者执行上述符号链接。
大约 4 年之前 回复
dqiaw48488
dqiaw48488 该命令为我解决了这个问题。 您能否详细说明为什么需要这样做,以及在编译Go lib时是否有避免这种情况的方法? 谢谢
大约 4 年之前 回复



我使用这些选项在gopine中编译了二进制文件</ p>

  GOOS = linux GOARCH =  amd64 CGO_ENABLED = 0进行构建-o [二进制名称] 
</ code> </ pre>

有效。</ p>
</ div>

展开原文

原文

I compiled go binary in alpine with these options

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o [name of binary]

It worked.

doz59484
doz59484 对于使用Bazel的任何人,都可以使用--features = static --features = pure标志来完成上述操作。
2 年多之前 回复
dousi8559
dousi8559 也许并不出乎意料,我发现在Mac机上为高山docker编译时,除了“ CGO_ENABLED = 0”标志外,我还需要“ GOOS = linux GOARCH = amd64”标志。
大约 3 年之前 回复



在Debian 9(Stretch)/ Go 1.10.2下构建并在Alpine 3.7.0下运行时:</ p>
\ n

  CGO_ENABLED = 0进行构建
</ code> </ pre>

GOOS = linux </ code>和 GOARCH = amd6 </ code >是必需的。</ p>
</ div>

展开原文

原文

When building under Debian 9 (Stretch) / Go 1.10.2 and running under Alpine 3.7.0:

CGO_ENABLED=0 go build

Neither GOOS=linux nor GOARCH=amd6 was necessary.



根据程序的性质,您可能希望使用静态链接选项来编译go程序,例如:</ p>

-x -a -tags netgo -installsuffix netgo </ p>

之后,您无需担心链接正确的库。</ p>
< / DIV>

展开原文

原文

Depending on the nature of the program, you might want to compile your go program with static link options, such as the following:

-x -a -tags netgo -installsuffix netgo

Afterwards you do not need to worry about linking the correct libraries.

Alternatively, you can (meanwhile) use the golang:alpine image from Docker Hub to compile and run your code.

docker run -v ${YOUR_CODE_PATH}:/go/src/example -it golang:alpine sh
cd src/example
go build .
ldd example
    /lib/ld-musl-x86_64.so.1 (0x7f677fcf7000)
    libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7f677fcf7000)
drzdu44226
drzdu44226 我猜需要维护工作。 它仍然是golang:latest大小的一半。 但是,您是对的,如果空间比可维护性更重要,那么选择平原(双关语)是可行的方法。
2 年多之前 回复
dotws86260
dotws86260 有什么理由要使用golang:alpine来运行应用程序,而不仅仅是使用更小的阿尔卑斯图? golang:1.10-alpine是376 MB,而alpine:3.7是4.15 MB。
2 年多之前 回复
doujingjiao0015
doujingjiao0015 感谢您的询问! 我已经相应地更新了答案。
2 年多之前 回复
doudou098123
doudou098123 您是指编译还是运行时环境? 使用该映像进行编译会自动编译链接到musl的二进制文件吗? 您的答案中的更多细节会很棒:)
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐