在 Arch Linux 上运行 CentOS Docker 镜像会退出并显示代码 139?

在 Arch Linux 上运行 CentOS Docker 镜像会退出并显示代码 139?

我正在尝试在我的 Arch Linux 主机上运行 CentOS Docker 镜像。运行以下命令除了 139 错误代码之外不会返回任何内容:

$ docker run -ti centos:centos6 /bin/bash                                                                                                                                
[139] $  

我有 CentOS Docker 镜像:

centos              centos6             0cbf37812bff        2 weeks ago         194MB

容器列表下有一个 centOS 容器

$ docker ps -a|grep cento                                                                                                                                                
2ef0f0d7439c        centos:centos6         "/bin/bash"              5 minutes ago       Exited (139) 5 minutes ago                       elated_turing

Docker 日志也​​不返回任何内容:

$ docker logs <container id>
$

我尝试过使用其他 Docker 镜像并且它们可以工作,但它似乎只影响 CentOS 镜像,但我需要在工作中使用 centOS。

答案1

它们是从版本 4.11 开始对 Linux 内核中的 vsyscall 链接进行的更改,导致运行 Centos 6.x 的容器出现问题

2个解决方案:

  • 使用 7.x Centos 镜像
  • 尝试使用参数启动内核vsyscall=emulate

GRUB 示例, 调整/etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="vsyscall=emulate"

然后运行update-grub

systemd-boot 的示例,修改你的conf/boot/loader/entries并将参数添加到选项行:

title Arch Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options *EXISTINGPARAMS* vsyscall=emulate

答案2

当然,最好的解决方案是按照其他答案中的建议使用vsyscall=emulate,但如果您无法重新启动包含 CentOS 6 容器的计算机(或者只是在 chroot 中安装 CentOS 6,如我的情况)并且不介意一些心脏直视手术,还可以将 CentOS 6“升级”为使用 CentOS 7 glibc 版本来解决该问题。请注意,仅仅替换libc.so是不够的,您需要将至少以下文件从 CentOS 7 系统复制到/lib64目录:ld-2.17.solib{c,dl,m,pthread}-2.17.so然后更新相应的符号链接,即ld-linux-x86-64.so.2libc.so.6libdl.so.2libm.so.6libpthread.so.0以指向 2.17 版本而不是 2.12 版本。

相关内容