Docker - 指令命令

您好,未來的 Docker 巫師!我很興奮能成為您在 Docker 命令世界中的導遊。作為一個教了多年計算機科學的人,我可以告訴您,Docker 對開發者來說就像一根魔杖。它讓我們的生活變得簡單許多!所以,讓我們挽起袖子,一起進入 Docker 指令命令的迷人領域。

Docker - Commands

CMD 指令

CMD 指令就像是電影中的主角 - 在 Docker 容器中,它是大放異彩的明星。它告訴 Docker 在您的容器啟動時要運行哪個命令。

基本語法

CMD ["可執行文件", "參數1", "參數2"]

讓我們用一個簡單的例子來分解這個:

FROM ubuntu
CMD ["echo", "Hello, Docker World!"]

在這個例子中,當您運行您的容器時,它會將 "Hello, Docker World!" 打印到控制台。這就像您的容器一醒來就向您問好一樣!

多個 CMD 指令

這裡有一個小陷阱問題:如果您在 Dockerfile 中有多個 CMD 指令會怎麼樣?

FROM ubuntu
CMD ["echo", "第一個命令"]
CMD ["echo", "第二個命令"]

如果您猜測兩個命令都會運行,那麼我恐怕您已經落入了一個常見的陷阱!實際上,只有最後一個 CMD 指令會被执行。這就像在戲劇中 - 只有最後一幕才是最重要的!

Shell 形式與 Exec 形式

CMD 可以寫成兩種形式:

  1. Shell 形式:CMD 命令 參數1 參數2
  2. Exec 形式:CMD ["可執行文件", "參數1", "參數2"]

Exec 形式更受推崇,因為它更明確,並且避免了 shell 解析的問題。

ENTRYPOINT

如果 CMD 是主角,那麼 ENTRYPOINT 就是 Docker 電影的導演。它為容器設定了主要命令,當容器啟動時無法被覆蓋。

基本語法

ENTRYPOINT ["可執行文件", "參數1", "參數2"]

讓我們看一個例子:

FROM ubuntu
ENTRYPOINT ["echo", "Hello from"]
CMD ["Docker"]

當您運行這個容器時,它會輸出 "Hello from Docker"。但這裡有點意思!如果您運行容器並帶有附加參數,它們將會替換 CMD 但不會替換 ENTRYPOINT。

docker run myimage World

這會輸出 "Hello from World"。這就像 ENTRYPOINT 在設置舞臺,而 CMD(或運行時參數)是在上面表演的演員!

ENV

ENV 就像是我們 Docker 作品的服裝部門。它設置可以在容器中使用的環境變量。

基本語法

ENV 鍵=值

這裡有一個實際的例子:

FROM ubuntu
ENV MY_NAME="Docker 狂熱者"
CMD ["sh", "-c", "echo Hello, $MY_NAME!"]

當容器運行時,這會輸出 "Hello, Docker 狂熱者!" 它就像給您的容器一個名牌一樣!

多個 ENV 指令

與 CMD 不同,您可以有多個 ENV 指令,而且它們都會生效:

FROM ubuntu
ENV MY_NAME="Docker 狂熱者"
ENV MY_DOG=Rex MY_CAT=Fluffy
CMD ["sh", "-c", "echo Hello, $MY_NAME! Your pets are $MY_DOG and $MY_CAT."]

這個容器會向您問好並介紹您的寵物!

WORKDIR

WORKDIR 就像是我們 Docker 作品的佈景設計師。它為 Dockerfile 中跟隨它的任何命令設置工作目錄。

基本語法

WORKDIR /路徑/到/目錄

讓我們看看它是如何工作的:

FROM ubuntu
WORKDIR /app
COPY . .
CMD ["ls", "-l"]

這個 Dockerfile 將工作目錄設置為 /app,將當前目錄內容複製到其中,然後當容器運行時列出內容。這就像告訴您的容器:"嘿,在這個目錄裡給自己弄個舒服的地方!"

多個 WORKDIR 指令

您可以使用 WORKDIR 多次來更改目錄:

FROM ubuntu
WORKDIR /app
WORKDIR src
WORKDIR scripts
RUN pwd

這將輸出 /app/src/scripts。這就像給您的容器帶著它參觀它的新家!

準備好所有的東西

現在,我們已經見過所有的 Docker 指令命令,讓我們看看它們如何在真實世界的場景中一起工作。想像一下我們正在創建一個簡單的 Python 網絡應用程序:

FROM python:3.9-slim

# 設置環境變量
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# 設置工作目錄
WORKDIR /app

# 安裝依賴
COPY requirements.txt .
RUN pip install -r requirements.txt

# 複製項目
COPY . .

# 命令來運行應用程序
ENTRYPOINT ["python"]
CMD ["app.py"]

這個 Dockerfile 設置了 Python 環境,安裝了依賴,複製了我們的應用程序代碼,並指定了如何運行應用程序。這就像為我們的 Python 應用程序創造完美環境的配方!

命令總結

這裡是一個我們已經介紹過的命令的快速參考表:

命令 描述 示例
CMD 指定容器啟動時運行的命令 CMD ["python", "app.py"]
ENTRYPOINT 設置容器的主要命令 ENTRYPOINT ["python"]
ENV 設置環境變量 ENV MY_VAR=value
WORKDIR 設置工作目錄 WORKDIR /app

記住,這些命令就像是您 Docker 容器的積木。將它們混合搭配,為您的應用程序創造完美的環境!

那就這樣吧,親愛的學生們!我們一起穿越了 Docker 指令命令的土地,從星光璀璨的 CMD 到導演的 ENTRYPOINT,再到服裝設計的 ENV 和佈景設計的 WORKDIR。我希望這個指南為您在 Docker 冒險中的道路照亮了光明。記住,熟能生巧,所以不要害怕試驗這些命令。祝您 Docker 學習愉快!

Credits: Image by storyset