![在 Arch Linux 上运行 CentOS Docker 镜像会退出并显示代码 139?](https://linux22.com/image/141288/%E5%9C%A8%20Arch%20Linux%20%E4%B8%8A%E8%BF%90%E8%A1%8C%20CentOS%20Docker%20%E9%95%9C%E5%83%8F%E4%BC%9A%E9%80%80%E5%87%BA%E5%B9%B6%E6%98%BE%E7%A4%BA%E4%BB%A3%E7%A0%81%20139%EF%BC%9F.png)
我正在尝试在我的 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.so
,lib{c,dl,m,pthread}-2.17.so
然后更新相应的符号链接,即ld-linux-x86-64.so.2
、libc.so.6
、libdl.so.2
、libm.so.6
和libpthread.so.0
以指向 2.17 版本而不是 2.12 版本。