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!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章