【问题标题】:Docker: Can't access binary copied to certain imagesDocker:无法访问复制到某些图像的二进制文件
【发布时间】:2020-08-14 06:54:37
【问题描述】:

我正在尝试从 migrate 容器访问二进制文件 COPYed。当我 COPYpython:3.7-alpine 时它可以工作,但是当我 COPYdebian:buster-slim 时它找不到。

重现的最少步骤:

1.创建Dockerfile.test

FROM migrate/migrate:v4.6.2 AS migrate
FROM python:3.7-alpine
COPY --from=migrate /migrate /
CMD "/migrate"
  1. 构建并运行。这行得通。
docker build . -t migrate_test -f Dockerfile.test
docker run --name migrate_test migrate_test:latest
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]
  1. 停止并移除容器
docker stop migrate_test;docker rm migrate_test;
  1. 在 Dockerfile.test 中更改镜像
FROM migrate/migrate:v4.6.2 AS migrate
FROM debian:buster-slim
COPY --from=migrate /migrate /
CMD "/migrate"
  1. 构建并运行。这不起作用
docker build . -t migrate_test -f Dockerfile.test
docker run --name migrate_test migrate_test:latest
/bin/sh: 1: /migrate: not found

【问题讨论】:

  • 您尝试过如何调试此问题?例如,我可能会尝试docker run --rm --entrypoint /usr/bin/ldd migrate_test /migrate 来查看一个与另一个之间是否缺少共享库依赖项。 (删除ENTRYPOINT 并设置CMD ["/migrate"] 会减少这种尴尬。)
  • @DavidMaze 好主意。我只是缩短了它。当我执行到容器中时,/migrate 以文件的形式存在,但在尝试执行时出现相同的not found 错误。
  • 就是这样! Ldd 显示了图像上缺少的库。安装依赖项后,它可以工作。简单的not found 错误让我大吃一惊。谢谢!

标签: docker


【解决方案1】:

看起来您的工作正常,但只是为了向可能会发现您的问题的其他人澄清情况:

问题在于migrate/migrate:v4.6.2 是基于Alpine 映像构建的,该映像使用MUSL libc,而大多数其他发行版使用glibc。您会收到“未找到”消息,因为内核正在寻找其路径嵌入在映像中的动态加载程序,正如我们在 ldd 命令中看到的那样:

/ # ldd /migrate
        /lib/ld-musl-x86_64.so.1 (0x7f9e42ebd000)
        libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7f9e42ebd000)

此二进制文件将在基于 Alpine 的映像上可用,但在来自 Debian、Ubuntu、Fedora、CentOS 等的映像上不可用。一种选择是简单地复制 Dockerfile 中必要的加载程序:

FROM migrate/migrate:v4.6.2 AS migrate
FROM debian:buster-slim
COPY --from=migrate /migrate /
COPY --from=migrate /lib/ld-musl-x86_64.so.1 /lib/ld-musl-x86_64.so.1

CMD "/migrate"

另一种解决方案是为您的目标分发重新构建migrate 命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多