Docker 初學常見問題 - CMD vs ENTRYPOINT 兩者的差異與範例

前言 很多人在初學 Docker 時,通常都會知道 CMD 和 ENTRYPOINT 基本上可以互換,但又覺得很疑惑既然兩個指令能互換為什麼要提供兩個指令給我們用? 但其實這兩者是有一些差異的,今天這篇文章就是來帶你了解 Dockerfile 中的 CMD 和 ENTRYPOINT CMD vs ENTRYPOINT 我這邊準備了兩個 Dockerfile,分別使用了 CMD 和 ENTRYPOINT FROM ubuntu:22.04 CMD [ "echo", "Hello from CMD" ] FROM ubuntu:22.04 ENTRYPOINT [ "echo", "Hello from ENTRYPOINT" ] 接著 build 了兩個 docker image,分別取名為 docker-cmd, docker-entrypoint $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker-entrypoint latest fa8ea026cc54 12 days ago 77.9MB docker-cmd latest bd73abaca1f4 12 days ago 77.9MB CMD 會被覆寫、ENTRYPOINT 則不會 理應來說我用 docker-cmd 這個 image 啟動一個容器,會打印出 Hello from CMD,執行結果確實也是如此:...

February 7, 2024 · 2 min

Docker 踩坑紀錄 - 運行階段 Bind Mount 覆蓋 WORKDIR 的內容

我踩到了什麼坑 本文的背景延續自我之前的文章《一個專案需要多個 Dockerfile - 淺談建構上下文 (build context)》 因為我們目前經手的專案會需要針對不同環境或是測試 Build 不同的 Image,為了讓目錄架構更具組織性且容易理解,我們根據不同的環境把各個環境的 Dockerfile, docker-compose.yaml, .sh 等等放在各個環境的目錄下,現在的目錄架構大概像這樣 ↓: E2Eproject/ ├── testenvironment1/ │ └── Dockerfile ├── testenvironment2/ │ ├── docker-compose.yaml │ └── Dockerfile ├── start-headless-tests.sh └── requirements.txt 由於我正在本地 Debug 這個專案,需要在本地運行 Docker-compose,我便很自然的執行 docker-compose -f ./cicd/headless/docker-compose.yaml up,結果 Docker 容器運行起來時,遇了一個錯誤:/bin/bash: /usr/src/app/cicd/headless/start-headless-tests.sh: No such file or directory。 這個錯誤讓我想也想不透哪邊出錯,我一開始都是針對 Dockerfile 去做動作,但完全沒有用 這邊就附上當時錯誤發生時的 Dockerfile 和 docker-compose.yaml,大家可以試著猜猜看是哪個環節導致錯誤! E2Eproject/cicd/headless/Dockerfile ↓ # Dockerfile # Use the official Python base image from the DockerHub....

January 28, 2024 · 3 min

一個專案需要多個 Dockerfile - 淺談建構上下文 (build context)

最近在寫 E2E 測試遇到一個問題,因 E2E 專案中,除了專案本身的 Docker Image 需要 Build 之外,還有多個測試環境的 Image 也要 Build,這造成了我在這個專案上需要創建多個 Dockerfile 發生了什麼問題? 我一開始的錯誤處理方式 菜鳥時期的我,以為 Dockerfile 就是一定得命名為"Dockerfile",這導致了我沒辦法在專案根目錄下創建三個 Dockerfile,因為會導致命名衝突 那我想出了什麼處理方式?相當簡單,很菜的我,一開始便自然地根據不同環境在專案下創建了不同的目錄,然後在目錄底下存放各自的 Dockerfile 就很類似這種感覺: E2Eproject/ ├── testenvironment1/ │ └── Dockerfile ├── testenvironment2/ │ └── Dockerfile ├── requirements.txt └── Dockerfile 接著便接著發生下一個問題 — 錯誤的建構上下文 以其中一個測試環境內的 Dockerfile 為範例,當時我的寫法如下,請特別注意 COPY ../ /usr/src/app/ 這行 # Use the official Python base image from the DockerHub. FROM python:3.12 # Set the working directory within the container. WORKDIR /usr/src/app # Set the PYTHONPATH environment variable....

January 20, 2024 · 3 min