刚刚开始学习容器,所以我可能错过了一些东西/还没有读够,但我遇到了一种奇怪的行为,并试图了解正在发生的事情。我尝试谷歌搜索,但无法找到解释,所以我无法判断我是否遗漏了一些概念,遇到了一些限制,或者遇到了错误。
基本上,当我尝试附加到容器时,容器会停止。
我在 Fedora 33 上使用从中央存储库安装的 podman v3.1.2 并遵循官方“入门”指南(这里)。我正在用户模式下运行所有内容(例如无根)。
指南中运行的初始命令的摘要:
$ podman pull docker.io/library/httpd >/dev/null
$ podman run -dt -p 8080:80/tcp docker.io/library/httpd
48cf6fbe988a6feb243c62e5298b37f51709251cc05f8d39f17566e1d7fc17f7
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48cf6fbe988a docker.io/library/httpd httpd-foreground 23 seconds ago Up 22 seconds ago 0.0.0.0:8080->80/tcp cool_cori
$ curl http://localhost:8080
<html><body><h1>It works!</h1></body></html>
$ podman stop -l
48cf6fbe988a6feb243c62e5298b37f51709251cc05f8d39f17566e1d7fc17f7
$ podman rm -l
48cf6fbe988a6feb243c62e5298b37f51709251cc05f8d39f17566e1d7fc17f7
到目前为止,一切都很好。现在我试图稍微偏离指南。我想看看是否可以命名容器并附加到它并从容器内运行 bash 终端。我浏览了一下man podman-run
并添加了--name
和--hostname
参数,这似乎没问题。另请通读man podman-attach
,听起来它应该允许我在容器中获得 bash 终端,但当我使用它时,它会停止容器。
$ podman run -dt --name "mycontainer" --hostname "testbox" -p 8081:80/tcp docker.io/library/httpd
77e74e729ac0dd86ed5a58aa3481909148de9017ffc52b327f7e69f74da22549
$ curl http://localhost:8081
<html><body><h1>It works!</h1></body></html>
$ podman attach mycontainer
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ podman start mycontainer
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77e74e729ac0 docker.io/library/httpd httpd-foreground 2 minutes ago Up 8 seconds ago 0.0.0.0:8081->80/tcp mycontainer
$ curl http://localhost:8081
<html><body><h1>It works!</h1></body></html>
$ podman attach mycontainer
[Fri Jul 02 23:35:04.479855 2021] [mpm_event:notice] [pid 1:tid 140188888724608] AH00492: caught SIGWINCH, shutting down gracefully
那么这是一个错误吗?否则,我做错了什么/为什么会这样?如果由于我的知识差距而导致这是愚蠢的事情,我深表歉意。也不知道为什么当我第一次尝试附加它时它会默默地停止,但下次它会打印一条消息。
我尝试用谷歌搜索错误并得到 3 个结果。一份是中文的,另外两份看起来与我的情况无关。我还通过关闭了 SELinux/etc/selinux/config
并重新启动,但这没有任何区别。
编辑:还要澄清一下,我使用的是默认值。除了命令中显示的内容之外,我没有对 podman、镜像或容器做任何特殊的事情。我cockpit
也安装了该软件包,但尚未使用它。
答案1
您正在尝试对正在运行的进程进行交互式控制。由于容器是使用该-t
选项运行的,因此 apache 会附加到终端,这并不意味着用于守护程序。连接到其终端会触发窗口更改/调整大小信号:SIGWINCH
。 Apache 将此解释为它保留的要求正常关闭的信号:容器停止。
你可能应该这样做:
作为守护进程运行守护进程(否
-t
)podman run -d --name "mycontainer" --hostname "testbox" -p 8081:80/tcp docker.io/library/httpd
-
姓名
podman-attach - 附加到正在运行的容器
[...]
说明 Attach 命令允许您使用容器的 ID 或名称附加到正在运行的容器,以查看其正在进行的输出或以交互方式控制它。
与
姓名
podman-exec - 在正在运行的容器中执行命令
[...]
描述
podman exec 在正在运行的容器中执行命令。
$ podman exec -it mycontainer bash root@testbox:/usr/local/apache2# ps -ef bash: ps: command not found root@testbox:/usr/local/apache2# ls -l /proc/1/exe lrwxrwxrwx 1 root root 0 Jul 3 11:50 /proc/1/exe -> /usr/local/apache2/bin/httpd root@testbox:/usr/local/apache2#