解决 Docker Scratch 镜像的“没有这样的文件或目录”错误
可能会出现令人沮丧的“没有这样的文件或目录”错误消息在使用 Docker 临时镜像时。此错误通常表示二进制名称与其实际名称不匹配,或者缺少指向基本库的动态链接。
在 Docker 临时映像中,二进制文件通常是从基础映像复制的。如提供的 Dockerfile 中所示,临时映像是通过从基础映像复制 /etc/passwd 等基本文件和二进制 $PROJ_BIN_PATH 来构建的。但是,要解决此错误,必须使用 CGO_ENABLED=0 指令禁用 CGO (C Go)。
启用 CGO 后,可以创建到 libc 或 libmusl 等库的动态链接,从而在以下情况下导致错误临时映像中的库不可用。通过禁用 CGO,将创建静态编译的二进制文件,从而无需外部库引用。
要使用此解决方案修复错误,请将现有的 RUN GOOS=linux GOARCH=amd64 go build 命令替换为以下内容Dockerfile:
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \ -ldflags="-w -s" -o $PROJ_BIN_PATH ./cmd/...
这将确保您的二进制文件是静态编译的并且不会依赖于外部库,从而解决“没有这样的库”的问题文件或目录”错误。
或者,您可以按照提供的解决方案中的建议,利用 Docker 中的 ldd 命令检查动态链接。通过运行 docker build --target=0 -t your_go_image 。然后 docker run -it --rm your_go_image ldd /$PROJ_NAME,您可以检查二进制文件的动态依赖关系并识别任何潜在的缺失库。
以上是如何解决 Docker Scratch 镜像中的'没有这样的文件或目录”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!