dockerfile cmd 與 entrypoint 的比較

CMD

  • 啟動時默認執行
  • 如果再docker 起來時啟動了其他命令,CMD內建的指令會被取代
  • 就算定義了多個CDM 只有 最後一個 會被執行

CMD 指令用於指定容器執行時默認的命令。它可以有三種不同的格式:

EXEC

1
CMD ["executable","param1","param2"]

shell

1
CMD command param1 param2

執行時輸入的命令

在 docker run 命令中指定的命令會覆蓋 Dockerfile 中的 CMD。

example

  • dockerfile
    1
    2
    3
    4
    5
    6
    7
    8
    FROM ubuntu:20.04
    ENV VERSION=2.0.1
    RUN apt-get update && \
    apt-get install -y wget && \
    wget https://github.com/ipinfo/cli/releases/download/ipinfo-${VERSION}/ipinfo_${VERSION}_linux_amd64.tar.gz && \
    tar zxf ipinfo_${VERSION}_linux_amd64.tar.gz && \
    mv ipinfo_${VERSION}_linux_amd64 /usr/bin/ipinfo && \
    rm -rf ipinfo_${VERSION}_linux_amd64.tar.gz
  • CMD
    1
    2
    3
    4
    5
    6
    7
    8
    $ docker image build -t ipinfo .
    $ docker container run -it ipinfo
    root@8cea7e5e8da8:/#
    root@8cea7e5e8da8:/#
    root@8cea7e5e8da8:/#
    root@8cea7e5e8da8:/# pwd
    /
    root@8cea7e5e8da8:/#
  • optput
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $docker image history ipinfo
    IMAGE CREATED CREATED BY SIZE COMMENT
    db75bff5e3ad 24 hours ago RUN /bin/sh -c apt-get update && apt-get… 50MB buildkit.dockerfile.v0
    <missing> 24 hours ago ENV VERSION=2.0.1 0B buildkit.dockerfile.v0
    <missing> 7 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
    <missing> 7 days ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
    <missing> 7 days ago /bin/sh -c [ -z "$(apt-get indextargets)" ] 0B
    <missing> 7 days ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 811B
    <missing> 7 days ago /bin/sh -c #(nop) ADD file:d6b6ba642344138dc… 74.1MB

Entrypoint

ENTRYPOINT 指令用於設定容器啟動時執行的命令。它也有兩種格式:

exec 格式(推薦)

在 Dockerfile 中使用 JSON 數組的形式。例如:

1
ENTRYPOINT ["executable","param1","param2"]

shell 格式

1
ENTRYPOINT command param1 param2

example

由於 entrypoint 的命令一定會被執行,因此可以搭配CMD用來當做 傳值 使用,

  • dockerfile
    1
    2
    3
    4
    5
    6
    7
    FROM ubuntu:latest

    # 定義 ENTRYPOINT
    ENTRYPOINT ["/bin/bash", "-c"]

    # 定義 CMD,提供默認命令
    CMD ["echo", "Hello, World!"]
  • 傳遞參數: 此時的外面的命令會取代default
    1
    2
    docker build -t my-image .
    docker run my-image echo "Custom Hello!"

example2

  • dockerfile
    1
    2
    3
    4
    5
    6
    7
    FROM ubuntu:latest

    # 定義 ENTRYPOINT
    ENTRYPOINT ["/bin/bash", "-c"]

    # 定義 CMD,提供默認命令,並使用環境變數
    CMD ["echo", "${GREETING:-Hello}, ${TARGET:-World}!"]
  • bash
    1
    2
    docker build -t my-image .
    docker run -e GREETING=Goodbye -e TARGET=Universe my-image
    這樣,CMD 中的 ${GREETING} 將被替換為 Goodbye,${TARGET} 將被替換為 Universe,最終執行的命令為 /bin/bash -c “echo Goodbye, Universe!”。

兩者比較

ENTRYPOINT 與 CMD 的不同之處在於,ENTRYPOINT 會把容器啟動時的命令視為其參數,而 CMD 僅提供默認值,可以被 docker run 命令中指定的命令覆蓋。

表格

特性 CMD ENTRYPOINT
能否被 docker run 覆蓋 是 是
exec 格式推薦 是 是
shell 格式支持 是 是
預設命令 可以有,提供默認值 可以有,提供默認值
容器啟動時的參數 用於覆蓋 CMD 的默認值 視為 ENTRYPOINT 的參數

dockerfile cmd 與 entrypoint 的比較
https://shengshengyang.github.io/2024/01/02/dockerfile-exec/
作者
Dean Yang
發布於
2024年1月2日
許可協議