Container

為什麼 podman 停止容器為什麼我嘗試附加到它?

  • July 3, 2021

剛開始學習容器,所以我可能錯過了一些東西/還沒有讀夠,但我遇到了一個奇怪的行為,並試圖了解正在發生的事情。我嘗試使用Google搜尋,但無法找到解釋,所以我無法判斷我是否遺漏了一些概念、遇到了一些限製或遇到了錯誤。

基本上,當我嘗試附加到容器時,容器會停止。

我在 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並添加了看起來不錯的--nameand參數。--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

那麼這是一個錯誤嗎?否則,我做錯了什麼/為什麼會這樣?抱歉,由於我的知識空白,這是愚蠢的事情。也不確定為什麼我第一次嘗試附加它時它會靜默停止,但下次它會列印一條消息。

我嘗試用​​Google搜尋錯誤並得到 3 個結果。一個是中文的,另外兩個看起來與我的情況無關。我還通過關閉 SELinux/etc/selinux/config並重新啟動,但這沒有任何區別。

編輯:還要澄清一下,我使用的是預設值。除了命令中顯示的內容之外,我還沒有為 podman、圖像或容器做任何特別的事情。我也安裝了該cockpit軟體包,但尚未使用它。

您正在嘗試對正在執行的程序進行互動式控制。由於容器是使用該-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# 

引用自:https://unix.stackexchange.com/questions/656799