CMD和ENTRYPOINT命令

村望老弟 發表於 2021-11-28

CMD命令

CMD命令在使用時,有三個基本原則需要我們遵守。

  • 容器啟動時預設執行的命令
  • 如果docker container run啟動容器時指定了其它命令,則CMD命令會被忽略
  • 如果定義多個CMD,只有最後一個CMD執行

app.js

let koa = require("koa")
let Router = require("koa-router")

const app = new koa();
const router = new Router();

router.get("/", async ctx => {
    ctx.body = "村望老弟的Docker測試伺服器測試資料"
})

app.use(router.routes())

app.listen({
    port: 3000
}, () => {
    console.log("村望老師的Docker測試伺服器跑起來啦");
})

dockerfile

FROM node:15.10.0-slim

ADD ./app.tar.gz  /app

WORKDIR /app

RUN npm install --registry=https://registry.npm.taobao.org 

CMD node app.js 

image-20211128112753303

容器啟動的時候執行CWD

ENTRYPOINT命令

ENTRYPOINT也可以設定容器啟動時要執行的命令。使用起來的語法很簡單

ENTRYPOINT和CMD的區別

  • CMD設定的命令,可以在 docker container run 時傳入其它命令,覆蓋掉 CMD 的命令,但是ENTRYPOINT所設定的命令時一定會被執行的。

    先看CMD配置的命令

    dockerfile.cmd

    FROM ubuntu:21.04
    CMD ["echo","hello docker"]

    構建映象

    docker image build -f dockerfile.cmd -t cmd-test .

    image-20211128113719253

    codehope  ~/CunWangOwn/docke-file-test  docker run cmd-test                                              
    hello docker

    但是我們可以在run的時候去覆蓋內部的CMD命令

    codehope  ~/CunWangOwn/docke-file-test  docker run cmd-test ls
    bin
    boot
    dev
    etc
    home
    lib
    lib32
    lib64
    libx32
    media
    mnt
    opt
    proc
    root
    run
    sbin
    srv
    sys
    tmp
    usr
    var

    可以看到 CMD ["echo","hello docker"]並沒有執行!

    然後看ENTRYPOINT配置的命令

    dockerfile.entrypoint

    FROM ubuntu:21.04
    ENTRYPOINT ["echo","hello docker"]

    構建映象

    docker image build -f dockerfile.entrypoint -t entry-test .

    執行映象

    codehope  ~/CunWangOwn/docke-file-test  docker run entry-test ls
    hello docker ls

    發現無法被覆蓋,好像能傳引數的趕腳?

  • ENTRYPOINTCMD 可以聯合使用, ENTRYPOINT 設定執行的命令,CMD傳遞引數。

    dockerfile.cmdentrymix

    FROM ubuntu:21.04
    ENTRYPOINT ["echo"]
    CMD []

    構建映象

    docker image build -f dockerfile.cmdentrymix -t cemixin .

    執行映象

    codehope  ~/CunWangOwn/docke-file-test  docker run cemixin input                                 
    input
本作品採用《CC 協議》,轉載必須註明作者和本文連結