dockerfile常用指令詳解

1. run

  1. 它接受命令作爲參數並用於創建鏡像。RUN會在shell或者exec的環境下執行命令。
  2. 參見CMD指令
RUN echo helloworld
RUN[“程序名”,“參數1”,“參數2”]#可以免除運行/bin/sh的消耗,如果參數中引號等特殊字符,需要進行轉義

2. copy & add

  1. COPY指令用來將本地的文件或者文件夾複製到鏡像的指定路徑下。
  2. ADD和COPY作用相似,可以從一個URL地址下載內容複製到容器的文件系統中,還可以將壓縮打包格式的文件解壓後複製到指定位置。
    文件複製均使用 COPY 指令,在需要自動解壓縮的場合使用 ADD
COPY /local/path/file /images/path/file
ADD file /images/path/file
ADD lasts.tar.gz /var/www

3. expose

  1. 標明這個鏡像中的應用將會監聽某個端口,並且希望能將這個端口映射到主機的網絡界面上,使容器內的應用可以通過端口和外界交互。
  2. 這裏只是暴露了容器的端口,具體指定映射需要在運行容器的時候-p(小寫)
expose 8080

4. CMD

  1. CMD和RUN命令相似,CMD可以用於執行特定的命令。CMD每次啓動容器時運行,RUN在創建鏡像時執行一次,固化在image中。RUN命令先於CMD和ENTRYPOINT。
  2. Dockerfile只允許使用一次CMD指令,一般都是腳本中最後一條指令。
  3. 如果docker run後面出現與CMD指定的相同的命令,那麼CMD就會被覆蓋。而ENTRYPOINT會把容器名後面的所有內容都當成參數傳遞給其指定的命令
CMD ["executable","param1","param2"]  #CMD 的推薦格式。 
CMD ["param1","param2"] #爲 ENTRYPOINT 提供額外的參數,此時 ENTRYPOINT 必須使用 Exec 格式。 
CMD command param1 param2  #Shell 格式

5. ENTRYPOINT

  1. 類似CMD.配置容器啓動後執行的命令,但是它不可被 docker run 提供的參數覆蓋
  2. 每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。
ENTRYPOINT ["executable", "param1", "param2"]# exec 這是 ENTRYPOINT 的推薦格式
ENTRYPOINT command param1 param2  #shell格式

備註:

#Exec 格式 
#ENTRYPOINT 的 Exec 格式用於設置要執行的命令及其參數,同時可通過 CMD 提供額外的參數。 
#ENTRYPOINT 中的參數始終會被使用,而 CMD 的額外參數可以在容器啓動時動態替換掉。 
#舉例: Dockerfile 片段: 
ENTRYPOINT ["/bin/echo", "Hello"]   
CMD ["world"] 
#當容器通過 docker run -it [image] 啓動時,輸出爲: 
Hello world 
#而如果通過 docker run -it [image] haha啓動,則輸出爲: 
Hello haha
#Shell 格式 
#ENTRYPOINT 的 Shell 格式會忽略任何 CMD 或 docker run 提供的參數。 

6. ONBUILD

  1. 爲鏡像添加觸發器。其指令在構建鏡像時候並不執行,而是在其子鏡像中執行
  2. 當我們在一個Dockerfile文件中加上ONBUILD指令,該指令對利用該Dockerfile構建鏡像(比如爲A鏡像)不會產生實質性影響。但是當我們編寫一個新的Dockerfile文件來基於A鏡像構建一個鏡像(比如爲B鏡像)時,這時構造A鏡像的Dockerfile文件中的ONBUILD指令就生效了,在構建B鏡像的過程中,首先會執行ONBUILD指令指定的指令,然後纔會執行其它指令。需要注意的是,如果是再利用B鏡像構造新的鏡像時,那個ONBUILD指令就無效了,也就是說只能再構建子鏡像中執行,對孫子鏡像構建無效。
FROM ubuntu:14.04
ONBUILD RUN echo “you not see me later”

7. VOLUME

  1. 向鏡像創建的容器中添加數據卷,數據卷可以在容器之間共享和重用。
  2. 數據卷的修改是立即生效的。數據卷的修改會對更新鏡像產生影響。數據卷會一直存在,直到沒有任何容器使用它。
VOLUME [“/data”,”/data2”]
VOLUME /data

8. 其他指令

USER

設置構建用戶

WORKDIR

爲RUN、CMD、ENTRYPOINT以及COPY和AND設置工作目錄

ENV

設置鏡像環境變量。在build docker imag的過程中有效,在image被創建和container啓動後作爲環境變量依舊也有效,並且可以重寫覆蓋。printenv可查看其值

# no default value
ENV hey
# a default value
ENV foo /bar
# or ENV foo=/bar
 
# ENV values can be used during the build
ADD . $foo
# or ADD . ${foo}
# translates to: ADD . /bar
 
# Use the following docker commands to set env
 
docker run -e "env_var_name=another_value" alpine env
docker run -e env_var_name alpine env
docker run --env-file=env_file_name alpine env
FROM

指明構建的新鏡像是來自於哪個基礎鏡像

FROM ubuntu:14.04
MAINTAINER

指明鏡像維護着及其聯繫方式

ARG

在構建鏡像時,指定一些參數,僅在build docker imag的過程中有效

# In the Dockerfile
ARG some_variable_name
# or with a hard-coded default:
#ARG some_variable_name=default_value
 
RUN echo "Oh dang look at that $some_variable_name"
 
# In the shell command
docker build --build-arg some_variable_name=a_value
 
# Then you will get
Oh dang look at that a_value

配合ENV

# expect a build-time variable
ARG A_VARIABLE
# use the value to set the ENV var default
ENV an_env_var=$A_VARIABLE
# if not overridden, that value of an_env_var will be available to your containers!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章