为什么 podman 会停止容器并尝试附加它?

为什么 podman 会停止容器并尝试附加它?

刚刚开始学习容器,所以我可能错过了一些东西/还没有读够,但我遇到了一种奇怪的行为,并试图了解正在发生的事情。我尝试谷歌搜索,但无法找到解释,所以我无法判断我是否遗漏了一些概念,遇到了一些限制,或者遇到了错误。

基本上,当我尝试附加到容器时,容器会停止。

我在 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 attachpodman exec

    姓名

    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# 
    

相关内容