將 TTY 附加到容器嗎?

大家好,

我正在嘗試進入某個容器的 shell,結果出現了這個畫面:

我需要做什麼才能啟用這些功能?我的 compose 檔案裡已經有 tty: true……但沒有用。我執行的其他容器都可以附加 shell,只有這個不行。如果我嘗試「執行」——就會出現這個錯誤:

完全卡住了……

如果你只需要使用 QNAP 的 shell,可以執行

docker exec -it containernme sh

這樣你就會進入該容器的 shell 環境

我應該在哪裡執行那個指令?是在 SSH shell 裡嗎?

你打開一個普通的 shell(在 Windows 中通過 CMD 執行 SSH 指令,或使用任何相容 SSH 的主控台程式,如 putty)

同樣的錯誤:

[jono@NA9D-NAS-3 ~]$ docker exec -it vikunja-vikunja-1 sh
OCI runtime exec failed: exec failed: unable to start container process: exec: "sh": executable file not found in $PATH: unknown
[jono@NA9D-NAS-3 ~]$

這就是為什麼我在問有關 Compose 的事情……

我猜這個容器沒有 shell

我剛剛在 uptime-kuma 上嘗試了這個,運作得很好

嗯,這正是我在問的。我要怎麼加入 shell……

我剛剛嘗試加上 stdin_open: true,感覺更接近了:

但還是無法進入容器的實際 shell。

所以沒有辦法進入 shell 嗎?我想執行一個指令來測試我的應用程式。也許可以用 docker exec 指令?

我會試試看。

在 docker compose 文件中新增以下兩行,以便在 CS 圖形介面中存取 tty

stdin_open: true
tty: true

我已經做了。沒有任何改變……

很奇怪,我可以在一個簡單的網路工具應用程式中連線並執行指令

services:
  network-tools:
    image: 'jonlabelle/network-tools:latest'
    restart: unless-stopped
    container_name: network-tools
    stdin_open: true
    tty: true
    networks:
      - backendApps
      
networks:     
  backendApps:
    external: true

可能你的應用程式沒有提供互動式 shell,你需要使用 Execute command(執行命令)來啟動一個 shell。

選擇你想要的(bash/sh),然後點擊 execute(執行),你就會得到一個登入 shell,可以在裡面執行指令。

看看這是否對你有幫助。

當我嘗試執行主控台時,會出現上方顯示的錯誤。

這很可能表示他們沒有在 docker 映像中打包 bash 指令。所以我認為你無法用 shell 連接到它。

/bin/sh 有用嗎?

如果這個 docker 是開源的,你也許可以查看 /bin 路徑下有哪些程式,然後用執行主控台(execute console)作為指令來運行它。

兩個主控台都沒有效。我不確定是否有辦法加入它。

問題在於:要在容器內執行指令,該指令必須存在於容器映像檔內。如果你的映像檔沒有 shell,你就無法執行 exec。

你也許可以新增一個 shell,但這需要知道映像檔是如何建構的。幸運的是,這是一個開源的建構。這裡有 Dockerfile:

從這裡可以看到它是基於 Alpine Linux 建構的。所以,建立一個以你的映像檔為基礎的 Dockerfile,並加入 bash。

FROM vikunja/vikunja
RUN apk add --no-cache bash

然後建構新的映像檔:
docker build newimage

如果你是用 docker-compose 檔案來啟動容器,你需要把 image 改成 “newimage”(或你想要的名稱)。然後你就可以在容器內 exec bash 了。

好的,謝謝。我得再研究一下。這樣更新起來確實有點麻煩。也許我會去 Vikunja 論壇問問為什麼沒有 shell。我正在嘗試執行診斷指令。

實際上,如果你只是想要除錯,那麼加入一個 shell 來協助也可以視為除錯流程的一部分。這不需要是永久性的……一旦你取得所需的資訊,就可以還原回原本的映像檔,然後繼續進行。

……當然,你很可能會碰到我經常遇到的情況:開啟除錯功能後,問題就自己解決了。:slight_smile: