1. run
- 它接受命令作爲參數並用於創建鏡像。RUN會在shell或者exec的環境下執行命令。
- 參見CMD指令
RUN echo helloworld
RUN[“程序名”,“參數1”,“參數2”]#可以免除運行/bin/sh的消耗,如果參數中引號等特殊字符,需要進行轉義
2. copy & add
- COPY指令用來將本地的文件或者文件夾複製到鏡像的指定路徑下。
- 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
- 標明這個鏡像中的應用將會監聽某個端口,並且希望能將這個端口映射到主機的網絡界面上,使容器內的應用可以通過端口和外界交互。
- 這裏只是暴露了容器的端口,具體指定映射需要在運行容器的時候-p(小寫)
expose 8080
4. CMD
- CMD和RUN命令相似,CMD可以用於執行特定的命令。CMD每次啓動容器時運行,RUN在創建鏡像時執行一次,固化在image中。RUN命令先於CMD和ENTRYPOINT。
- Dockerfile只允許使用一次CMD指令,一般都是腳本中最後一條指令。
- 如果docker run後面出現與CMD指定的相同的命令,那麼CMD就會被覆蓋。而ENTRYPOINT會把容器名後面的所有內容都當成參數傳遞給其指定的命令
CMD ["executable","param1","param2"] #CMD 的推薦格式。
CMD ["param1","param2"] #爲 ENTRYPOINT 提供額外的參數,此時 ENTRYPOINT 必須使用 Exec 格式。
CMD command param1 param2 #Shell 格式
5. ENTRYPOINT
- 類似CMD.配置容器啓動後執行的命令,但是它不可被 docker run 提供的參數覆蓋
- 每個 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
- 爲鏡像添加觸發器。其指令在構建鏡像時候並不執行,而是在其子鏡像中執行
- 當我們在一個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
- 向鏡像創建的容器中添加數據卷,數據卷可以在容器之間共享和重用。
- 數據卷的修改是立即生效的。數據卷的修改會對更新鏡像產生影響。數據卷會一直存在,直到沒有任何容器使用它。
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!