2016-01-11 19:44
浏览 258

在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

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.

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

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?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • douchi1945
    douchi1945 2016-02-24 21:24
    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.

    点赞 评论
  • douwei4370
    douwei4370 2016-12-13 18:35

    I compiled go binary in alpine with these options

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

    It worked.

    点赞 1 评论
  • dongyou8087
    dongyou8087 2017-05-09 07:54

    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)
    点赞 评论
  • dtng5978
    dtng5978 2017-05-15 20:40

    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.

    点赞 评论
  • dongya1228
    dongya1228 2018-06-11 23:09

    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.

    点赞 评论