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!