跳轉到

使用 docker 執行 node.js,問 AI 語法

用 docker 執行 node.js 環境,先從 shell 開始,因為需要執行 node file.js。一般是用 docker run 如下所示

docker run --rm -it node:22-alpine /bin/sh

怎麼改用 docker compose 實作呢?

我平常只用 AI 來翻譯英文,和做一些市場調查,例如問它「網站後端程式語言市占率」,想說問問看「請將 docker run --rm -it node:22-alpine /bin/sh 改用 docker compose」,結果如下:

ChatGPT

你可以使用 Docker Compose 來達成等效於 docker run --rm -it node:22-alpine /bin/sh 的效果。這裡的重點是:

  • 使用 node:22-alpine 映像
  • 進入一個互動式 shell
  • 容器在結束後自動移除(--rm

雖然 Docker Compose 本身沒有 --rm 的選項,但你可以透過 docker compose run 搭配 --rm 來達成類似效果。


方法一:使用 docker-compose.yml 搭配 docker compose run

建立一個 docker-compose.yml 檔案如下:

services:
  node:
    image: node:22-alpine
    stdin_open: true       # 等同於 -i
    tty: true              # 等同於 -t

然後執行這個指令:

docker compose run --rm node /bin/sh

方法二:使用 docker compose exec(需先啟動)

如果你想用 exec,必須先 docker compose up 啟動服務,範例如下:

docker compose up -d
docker compose exec node /bin/sh

但這樣就不會自動刪除容器了,不等同於 --rm


補充:如果只是一次性使用,其實用原本的 docker run --rm -it 會比較簡單。但如果你需要頻繁使用或整合到其他 Compose 設定中,以上方法會比較合適。

需要我幫你加入 volume 或 mount 目前目錄嗎?

Google Gemini

您可以透過以下 docker-compose.yml 檔案來實現 docker run --rm -it node:22-alpine /bin/sh 的功能:

YAML

version: '3.8'
services:
  node-shell:
    image: node:22-alpine
    stdin_open: true # 等同於 -i
    tty: true        # 等同於 -t
    command: /bin/sh
    # 若您希望容器停止後自動移除,可以加上以下這行,但請注意這在 docker compose 服務運行時可能不那麼常見,因為通常服務會持續運行。
    # restart: "no" # 或者不設定 restart,預設行為在容器停止後不會自動重啟。
    # 由於 docker compose 預設不會在服務停止後移除容器,若要達到 --rm 的效果,需要手動執行 docker compose down --volumes --rmi all

如何使用這個 docker-compose.yml 檔案:

  1. 儲存檔案: 將上述內容儲存為 docker-compose.yml 在您希望的位置。
  2. 啟動服務: 在終端機中,導航到 docker-compose.yml 檔案所在的目錄,然後執行以下命令:

    Bash

    docker compose run --rm node-shell
    

    這個命令會啟動 node-shell 服務,並在容器退出後自動移除容器(--rm 參數)。它會直接在 node-shell 服務中執行 command 定義的 /bin/sh,並提供互動式終端機。


docker run 命令的對應關係:

  • image: node:22-alpine:指定使用的 Docker 映像檔。
  • stdin_open: true (-i):保持標準輸入開放,即使沒有附加到它。
  • tty: true (-t):分配一個偽 TTY,這對於互動式 Shell 是必需的。
  • command: /bin/sh:指定容器啟動時要執行的命令,這就是您要進入的 Shell。
  • docker compose run --rm:這個命令本身就提供了 docker run 中的 --rm 功能,會在命令執行完畢後自動移除容器。

小提醒:

  • docker compose 主要用於管理多個服務的應用程式,通常服務會設計為長時間運行。而 docker run --rm -it 更多是用於臨時性的、一次性的容器操作,例如進入容器執行特定命令或調試。
  • 如果您只是想快速進入一個臨時容器的 Shell,docker run 可能是更直接和快速的方式。而 docker compose 則提供了一個更結構化、更可重複的方式來定義和運行容器環境。

這樣設定後,您就可以使用 docker compose 來進入 node:22-alpine 容器的 Shell 了。

感想

最後採用 ChatGPT 的方法二:使用 docker compose exec(需先啟動),因為我需要每天都執行 node.js ,但是不想要頻繁的新增和刪除容器。第一次用 ChatGPT 時,就感覺是比較高級的搜尋引擎,顯示的結果令人驚艷,但是還是要能理解內容才能拿來用,例如還是會 docker 才能使用上述的結果,看不懂就沒辦法了。

新增檔案 docker-compose.yaml 如下:

services:
  node:
    image: node:22-alpine
    stdin_open: true
    tty: true
    volumes:
      - ./src:/app
    working_dir: /app
    restart: "no"

新增並啟動容器,連線至容器後執行 /bin/sh

docker compose up -d
docker compose exec node /bin/sh

留言