Docker、Dockerfile解惑

1. Dockerfile裏指定執行命令用RUN、ENTRYPOING和CMD有何不一樣?

  • RUN僅僅是在 docker build 時運行的。
  • docker build完成以後會打包成一個鏡像,只有執行docker run後,纔會執行CMD或者ENTRYPOINT。
  • ENTRYPOINT和CMD的不一樣點在於執行docker run時參數傳遞方式。

區別以下:docker

1.1 CMD指定的命令能夠被docker run傳遞的命令覆蓋。

1.1.1 Dockerfile僅僅使用CMD指令ubuntu

Dockerfile:

FROM ubuntu
CMD ["echo", "far"]
➜  docker build -t run-test:0.1 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM ubuntu
 ---> 93fd78260bd1
Step 2/2 : CMD ["echo", "far"]
 ---> Running in 0f97a65b839e
Removing intermediate container 0f97a65b839e
 ---> 22e6e82769ea
Successfully built 22e6e82769ea
Successfully tagged run-test:0.1

>>> 咱們能夠看到,構建過程當中並無執行CMD中的echo指令,只是看到了構建信息 <<<
➜  docker run run-test:0.1
far
>>> 咱們能夠看到,在執行docker run後,CMD中的echo命令被執行了 <<<
➜  docker run run-test:0.1 echo bor
bor

>>> 咱們能夠看到,在執行docker run後,CMD中的echo命令被docke run的命令參數覆蓋了。 <<<

1.1.2 Dockerfile即便用CMD又使用RUNui

Dockerfile:

FROM ubuntu
CMD ["echo", "far"]
RUN ["echo", "foo"]
➜  docker build -t run-test:0.1 .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu
 ---> 93fd78260bd1
Step 2/3 : CMD ["echo", "far"]
 ---> Running in 44ef2a9c88ca
Removing intermediate container 44ef2a9c88ca
 ---> 559ca9f008a5
Step 3/3 : RUN ["echo", "foo"]
 ---> Running in f801910112ab
foo
Removing intermediate container f801910112ab
 ---> 6d042893d5e9
Successfully built 6d042893d5e9
Successfully tagged run-test:0.1

>>> 咱們能夠看到,構建過程當中並無執行CMD的echo指令,可是執行了RUN指令 <<<
➜  docker run run-test:0.1
far

>>> 咱們能夠看到,在執行docker run後,CMD中的echo命令被執行了 <<<
➜  docker run run-test:0.1 echo bor
bor

>>> 咱們能夠看到,在執行docker run後,CMD中的echo命令被docke run的命令參數覆蓋了。 <<<

1.2 ENTRYPOINT會把容器名後面的全部內容都當成參數傳遞給其指定的命令

1.1.1 Dockerfile僅僅使用ENTRYPOINT指令3d

Dockerfile:

FROM ubuntu
ENTRYPOINT ["echo", "far"]
➜  docker build -t run-test:0.1 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM ubuntu
 ---> 93fd78260bd1
Step 2/2 : ENTRYPOINT ["echo", "far"]
 ---> Running in ede61562f973
Removing intermediate container ede61562f973
 ---> 76dd760e3382
Successfully built 76dd760e3382
Successfully tagged run-test:0.1

>>> 咱們能夠看到,構建過程當中並無執行echo指令,只是看到了構建信息 <<<
➜  docker run run-test:0.1
far

>>> 咱們能夠看到,在執行docker run後,ENTRYPOINT中的echo命令被執行了 <<<
➜  docker run run-test:0.1 echo bor
far echo bor

>>> 咱們能夠看到,在執行docker run後,ENTRYPOINT會把容器名後面的全部內容都當成參數傳遞給其指定的命令 <<<
>>> 2. 另外,咱們能夠發現,在Dockerfile中,ENTRYPOINT指定的參數比運行docker run時指定的參數更靠前。
       例如此處其實是執行了:echo "far echo bor"

1.1.2 Dockerfile即便用ENTRYPOINT又使用RUNcode

Dockerfile:

FROM ubuntu
ENTRYPOINT ["echo", "far"]
RUN ["echo", "foo"]
➜  docker build -t run-test:0.1 .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu
 ---> 93fd78260bd1
Step 2/3 : ENTRYPOINT ["echo", "far"]
 ---> Running in b0e86020ab3e
Removing intermediate container b0e86020ab3e
 ---> 5d389a86c0dc
Step 3/3 : RUN ["echo", "foo"]
 ---> Running in f4eb7745c7a3
foo
Removing intermediate container f4eb7745c7a3
 ---> 323ab1e07c2e
Successfully built 323ab1e07c2e
Successfully tagged run-test:0.1

>>> 咱們能夠看到,構建過程當中並無執行ENTRYPOINT的echo指令,可是執行了RUN指令 <<<
➜  docker run run-test:0.1
far

>>> 咱們能夠看到,在執行docker run後,ENTRYPOINT中的echo命令被執行了 <<<
➜  docker run run-test:0.1 echo bor
far echo bor

>>> 1. 咱們能夠看到,在執行docker run後,ENTRYPOINT會把容器名後面的全部內容都當成參數傳遞給其指定的命令。 <<<
>>> 2. 另外,咱們能夠發現,在Dockerfile中,ENTRYPOINT指定的參數比運行docker run時指定的參數更靠前。
       例如此處其實是執行了:echo "far echo bor"
相關文章
相關標籤/搜索