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

de90aj5v  于 2023-08-01  发布在  Go
关注(0)|答案(7)|浏览(191)

我有一个Go二进制文件,我试图在Alpine Docker镜像上运行。
这对于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...]
...

字符串
但是,对于我想安装的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


我认为这可能与this answer有关,但我在运行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)


在Alpine Linux Docker上的路径中没有找到安装的Go二进制文件,对此有什么想法吗?

i86rm4rw

i86rm4rw1#

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

字符串
由于musl和glibc是兼容的,你可以创建这个符号链接,它将修复丢失的依赖项。

ufj5ltwl

ufj5ltwl2#

我用alpine用这些选项编译了go二进制

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

字符串
成功了。

xn1cxnb4

xn1cxnb43#

在Debian 9(Stretch)/ Go 1.10.2下构建并在Alpine 3.7.0下运行时:

CGO_ENABLED=0 go build

字符串
GOOS=linuxGOARCH=amd6都不是必需的。

bvk5enib

bvk5enib4#

您可以安装libc 6-compat

RUN apk add --no-cache libc6-compat

字符串

bihw5rsg

bihw5rsg5#

根据程序的性质,您可能希望使用静态链接选项编译go程序,例如:
-x -a -tags netgo -installsuffix netgo
之后,您不必担心链接正确的库。

woobm2wo

woobm2wo6#

或者,您可以(同时)使用来自Docker Hubgolang: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)

字符串

wwtsj6pe

wwtsj6pe7#

因此,使用libc 6-compat时,我仍然无法找到libresolv.so.2

RUN apk add --no-cache gcompat

字符串
一切正常
参见:https://github.com/golang/go/issues/59305及其简单答案/解决方案https://github.com/golang/go/issues/59305#issuecomment-1541493132

相关问题