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!”。

兩者比較

ENTRYPOINTCMD 的不同之處在於,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日
許可協議