我正在尝试为 openshift 构建容器。他们的要求之一是主进程是 pid 1。为了做到这一点,您的起始 shell 脚本应该使用 exec 来替换 shell 脚本。对于我们的应用程序,我们正在使用 Tomcat,所以我没有机会正确替换 catalina.sh,只能使用它,因为它确实使用了 exec,但命令没有被替换。所以我简化了容器,但问题仍然存在:Dockerfile:
FROM ubuntu:18.04
ADD test.sh /root/test.sh
RUN chmod a+x /root/test.sh
CMD /root/test.sh
测试文件
#!/bin/bash
exec /bin/sleep 3600
我使用构建容器docker build -t test .
如果我现在使用运行容器docker run --name test-ub test
然后执行docker top test-ub -ef
它显示:
UID PID PPID C STIME TTY TIME CMD
root 109019 108989 0 16:50 ? 00:00:00 /bin/sh -c /root/test.sh
root 109057 109019 0 16:50 ? 00:00:00 /bin/sleep 3600
两个进程不应该这样!如果我用 替换它,FROM ubuntu:18.04
它FROM centos:centos7
会按预期工作,只有一个进程:
UID PID PPID C STIME TTY TIME CMD
root 105946 105916 0 16:19 ? 00:00:00 /bin/sleep 3600
所以我认为问题出在 Ubuntu 的某个地方,但我不知道在哪里。任何帮助都非常感谢。
答案1
我发现同样的问题,在 stackoverflow 上有很好的答案。
我不想重复答案,只给出一个简短的摘要:
不同之处在于Ubuntu 和CentOS 中的默认设置。sh
如果 你使用以下命令运行命令,它将按预期工作:dash
bash
bash
CMD ["/bin/bash", "/root/test.sh"]