使用 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
檔案:¶
- 儲存檔案: 將上述內容儲存為
docker-compose.yml
在您希望的位置。 -
啟動服務: 在終端機中,導航到
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