在指定的镜像文件中找不到符合要求的ghost映像文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在指定的镜像文件中找不到符合要求的ghost映像文件相关的知识,希望对你有一定的参考价值。

参考技术A 你用虚拟光驱加载你下载的iso文件,然后在“我的电脑”里找到加载的虚拟系统光盘,打开找到自动运行程序,运行它后点还原系统,默认c盘,确定就自动安装了,之后不要管 参考技术B 查看所以文件本回答被提问者采纳

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

【中文标题】在 Alpine Linux Docker 的路径中找不到安装的 Go 二进制文件【英文标题】:Installed Go binary not found in path on Alpine Linux Docker 【发布时间】:2016-04-16 05:55:23 【问题描述】:

我正在尝试在 Alpine Docker 映像上运行一个 Go 二进制文件。

这适用于 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 二进制文件的任何想法?

【问题讨论】:

您是在主机上还是在 alpine 容器中运行 ldd?您是否检查了 ldd 输出中列出的库文件是否确实存在于 alpine 映像中? 在容器内运行lddldd 输出中列出的库文件存在于 Alpine 映像中。 rack 链接到 gnu libc,alipne 使用 musl libc。 另外,当我在容器中运行ldd /usr/local/bin/docker 时,我得到了输出ldd: /usr/local/bin/docker: Not a valid dynamic program ldd 用于打印共享库依赖项,docker 二进制文件是静态链接的。 【参考方案1】:
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

由于 musl 和 glibc 是兼容的,因此您可以创建此符号链接,它将修复缺少的依赖项。

【讨论】:

该命令为我解决了这个问题。您能否详细说明为什么需要这样做,以及在编译 Go 库时是否有办法避免这种情况?谢谢 安装的 Go 版本是用 glibc 编译的,在默认不安装的 Alpine 上。你可以用 muslc 编译你的 Go,这是 Alpine 的默认设置,或者像上面那样做符号链接。 @GuerlandoOCs music 可能是 musl libc 的拼写错误 将此行添加到 Dockerfile 会出现以下错误 # Error relocating ./my_go_binary: __fprintf_chk: symbol not found。似乎是C库之间的不兼容。还有其他人收到此错误吗? 虽然这对我有用,但它仍然是一种解决方法。最后我选择跟随 Kuldeep 的回答并使用CGO_ENABLED=0 go build。生成的二进制文件在 Alpine 上运行。【参考方案2】:

我使用这些选项在 alpine 中编译了 go 二进制文件

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

成功了。

【讨论】:

也许并不奇怪,我发现在 mac 机器上为 alpine docker 编译时,除了“CGO_ENABLED=0”标志之外,我还需要“GOOS=linux GOARCH=amd64”标志。 对于任何使用 Bazel 的人,以上都可以通过 --features=static --features=pure 标志来完成。 如果你想用一个包做这个并且“去获取”你可以直接做:CGO_ENABLED=0 go get -u YOUR_PACKAGE 并获得一个可以在 alpine 中工作的二进制文件。【参考方案3】:

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

CGO_ENABLED=0 go build

GOOS=linuxGOARCH=amd6 都不是必需的。

【讨论】:

【参考方案4】:

你可以安装 libc6-compat

RUN apk add --no-cache libc6-compat

【讨论】:

我认为这是从“二进制消费者”的角度来看最干净的答案。 我做了,但我仍然收到错误找不到符号错误加载共享库 libstdc++.so.6: 没有这样的文件或目录【参考方案5】:

根据程序的性质,您可能希望使用静态链接选项编译您的 go 程序,例如:

-x -a -tags netgo -installsuffix netgo

之后您无需担心链接正确的库。

【讨论】:

【参考方案6】:

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

【讨论】:

你的意思是编译还是作为运行环境?使用此图像进行编译会自动编译链接到 musl 的二进制文件吗?在您的答案中提供更多细节会很棒:) 感谢您的提问!我已经相应地更新了答案。 是否有任何理由使用golang:alpine 来运行应用程序而不是仅使用很多 更小的alpine 图像? golang:1.10-alpine 是 376 MB,而 alpine:3.7 是 4.15 MB。 我猜是维护工作。它仍然是 golang:latest 的一半大小。但是你是对的,如果空间比可维护性更重要,那么使用普通的高山(双关语)是要走的路。

以上是关于在指定的镜像文件中找不到符合要求的ghost映像文件的主要内容,如果未能解决你的问题,请参考以下文章

ghost后的gho镜像文件太大超出刻盘要求

点击IE游览器显示找不到映像文件中指定的资源语言标识McShield

怎么删除c盘里的硬盘映像文件啊?

找不到映像文件中指定的资源类型 GetLastError 1813

点击IE游览器显示找不到映像文件中指定的资源语言标识McShield

模拟器在内核映像文件中找不到“Linux 版本”字符串