Docker 采用 Alpine 镜像提示 sh: not found

装了 1panel 以后突然喜欢上了写 docker-compose.yml(x ,有一些小工具用 Alpine 作镜像就够了,但是在写 tailscale derper 的 docker compose 的时候容器怎么也跑不起来,执行 go 二进制文件提示 sh: ./derper not found

有点奇葩了。刚开始其实没想到是 Alpine 镜像的问题,后来查了很久才明白是怎么一回事。

因为 Alpine 太精简了,它用的是 musl libc 而不是标准的 gnu libc,然后就会导致这些问题。

解决办法

因为项目很小很小,所以咱是直接用 Alpine 镜像,采用 command 在容器中执行 sh 来运行项目的。

思路是把要用到的 libc 库补全。命令如下:

    command:
      - sh
      - -c 
      - |
        mkdir /lib64; ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2; apk add gcompat
        gcompat include libresolv.so.2
        # Proceed with your workflow! :)

其中 gcompat include libresolv.so.2 是安装所需库的命令。当执行可执行文件时,假如库不存在,会报错:

Error loading shared library libresolv.so.2: No such file or directory (needed by ./derper)
Error relocating ./derper: __res_search: symbol not found

找出缺失的库添加到后面就行啦!

评论区
头像
文章目录