简体   繁体   English

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

[英]Installed Go binary not found in path on Alpine Linux Docker

I've got a Go binary I'm trying to run on the Alpine Docker image.我有一个要在 Alpine Docker 映像上运行的 Go 二进制文件。

This works fine for the Docker Go binary.这适用于 Docker Go 二进制文件。

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.但是,对于我要安装的 Go 二进制文件。

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时我没有得到同样的错误。

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?在 Alpine Linux Docker 的路径中找不到这个已安装的 Go 二进制文件的任何想法?

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.由于 musl 和 glibc 兼容,您可以创建此符号链接,它将修复缺失的依赖项。

I compiled go binary in alpine with these options我用这些选项在 alpine 中编译了 go binary

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

It worked.有效。

When building under Debian 9 (Stretch) / Go 1.10.2 and running under Alpine 3.7.0:在 Debian 9 (Stretch) / Go 1.10.2 下构建并在 Alpine 3.7.0 下运行时:

CGO_ENABLED=0 go build

Neither GOOS=linux nor GOARCH=amd6 was necessary. GOOS=linuxGOARCH=amd6是必需的。

You can install libc6-compat您可以安装 libc6-compat

RUN apk add --no-cache libc6-compat

Depending on the nature of the program, you might want to compile your go program with static link options, such as the following:根据程序的性质,您可能希望使用静态链接选项编译您的 go 程序,例如:

-x -a -tags netgo -installsuffix netgo -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 Hub中的golang:alpine图像来编译和运行您的代码。

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM