Docker:无法访问复制到某些图像的二进制文件

我正在尝试COPYmigrate容器访问二进制ed

。当我COPY使用python:3.7-alpine它时,但是找不到我COPY使用debian: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 ]

  2. 停止并取出容器

    docker stop migrate_test;docker rm migrate_test;

  3. 在Dockerfile.test中更改图像

    FROM migrate/migrate:v4.6.2 AS migrate

    FROM debian:buster-slim

    COPY –from=migrate /migrate /

    CMD “/migrate”

  4. 构建并运行。这不行

    docker build . -t migrate_test -f Dockerfile.test

    docker run –name migrate_test migrate_test:latest

    /bin/sh: 1: /migrate: not found

回答:

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

问题是,该版本migrate/migrate:v4.6.2基于使用MUSL libc的Alpine映像构建,而其他大多数发行版都使用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为您的目标发行版重建命令。

以上是 Docker:无法访问复制到某些图像的二进制文件 的全部内容, 来源链接: utcz.com/qa/401272.html

回到顶部