Dockerfile命令格式:
#nginx:test(镜像名称:镜像标签)
docker build -t nginx:test .
1.CMD
功能:CMD指令用于指定一个容器启动时要运行的命令。
例:这里我们将-l标志传递给了/bin/bash命令。
CMD ["/bin/bash","-l"]
Docker推荐一直使用以数组语法来设置要执行的命令。
注:使用docker run
命令可以覆盖CMD指令。
2.ENTRYPOINT
功能:ENTRYPOINT与CMD指令类似,ENTRYPOINT指令提供的命令不容易在启动容器时被覆盖。实际上,docker run
命令行中指定的任何参数都会被当作参数再次传递给ENTRYPOINT指令中指定的命令。
例:
#为ENTRYPOINT指令指定参数
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
#用新的ENTRYPOINT指令重新构建static_web镜像
sudo docker build -t="test/static_web" .
#使用docker run 命令启动包含ENTRYPOINT指令的容器
sudo docker run -t -i test/static_web -g "daemon off;"
重新并构建了一个新的镜像,并且启动了一个交互的容器。我们指定了-g ”daemon off;"
参数,这个参数会传递给用ENTRYPOINT指定的命令,在这里该命令为/usr/sbin/nginx -g "daemon off;"
。该命令会议前台运行的方式启动Nginx守护进程,此时这个容器就会作为一台Web服务器来运行。
#同时使用ENTRYPOINT和CMD指令
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]
此时当我们启动一个容器时,任何在命令行中指定的参数都会被传递给Nginx守护进程。比如,我们可以指定-g "daemon off;"
参数让Nginx守护进程以前台方式运行。如果再启动容器时不指定任何参数,则在CMD指令中指定的-h
参数会被传递给Nginx守护进程,即Nginx服务器会以/usr/sbin/nginx -h
的方式启动,该命令用来显示Nginx的帮助信息。
3.WORKDIR
功能:WORKDIR指令用来在从镜像创建一个新容器时,在容器内部设置一个工作目录,ENTRYPOINT和/或CMD指定的程序会在这个目录下执行。
#使用WORKDIR指令
WORKDIR /opt/webapp/db
Run bundle install
WORKDIR /opt/webapp
ENTRYPOINT ["rackup"]
我们将工作目录切换为/opt/webapp/db
后运行了bundle install
命令,之后又将工作目录设置为/opt/webapp
,最后设置了ENTRYPOINT
指令来启动rackup
命令。
-w
标志在运行时覆盖工作目录
sudo docker run -ti -w /var/log ubuntu pwd /var/log
该命令会将容器内的工作目录设置为/var/log
4.ENV
功能:ENV指令用来在镜像内构建过程中设置环境变量。
例:
ENV RVM_PATH /home/rvm
这个新的环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面制定了环境变量前缀一样
RUN gem install unicorn
该指令会以如下方式执行:
RVM_PATH=/home/rvm/ gem install unicorn
也可以是用docker run
命令行的-e
标志来传递环境变量。这些变量将只会在运行时有效
5.USER
功能:USER指令用来指定该镜像会以什么样的用户去运行。
例:
USER nginx
基于该镜像启动的容器会以nginx用户的身份来运行,如果不通过USER指令指定用户,默认用户为root。
6.VOLUME
功能:VOLUME指令用来向基于镜像创建的容器添加卷。 一个卷是可以存在与一个或者多个容器内的特定目录,这个目录可以绕过联合文件系统,并提供如下共享数据或者对数据进行持久化的功能。
- 卷可以在容器间共享和重用。
- 一个容器可以不是必须和其他容器共享卷。
- 对卷的修改时立时生效的。
- 对卷的修改不会对更新镜像产生影响。
- 卷会一直存在直到没有任何容器再使用它。
卷功能让我们可以将数据(如源代码)、数据库或者其他内容添加到镜像中而不是将这些内容提交到镜像中,并且允许我们再多个容器件共享这些内容。
例:
#指定一个挂载点
VOLUME ["/opt/project"]
##数组方式指定多个挂载点
VOLUME ["/opt/project","/data"]
这条指令将会为基于此镜像创建的任何容器创建一个名为/opt/project
的挂载点。
7.ADD
功能:ADD指令用来将构建环境下的文件和目录复制到镜像中。如果将一个归档文件(合法的归档文件包括gzip、bzip2、xz)指定为源文件,Docker会自动将归档文件解开(unpack)。
例:
ADD latest.tar.gz /var/www/wordpress
指向源文件的位置参数可以是一个URL,或者构建上下文或环境中文件名或者目录。不能对构建目录或者上下文职位的文件进行ADD操作。
如果目的位置的目录下已经存在了 和归档文件同名的文件或者目录,那么目的位置中的文件或者目录不会被覆盖。
8.COPY
功能:与ADD指令类似,它们的根本不同时COPY只关心在构建上下文中复制本地文件,而不会去做文件提取和解压的工作。
例:
COPY test.txt/ /etc/apache2/
这条指令将会把本地test.txt
目录中的文件复制到/etc/apache2/
的目录中。
如果目的位置不存在,Docker将会自动创建所有需要的目录结构,就像mkdir -p
命令。
9.LABEL
功能:LABEL指令用于为Docker镜像添加元数据。元数据以键值对的形式展现。
例:
LABEL location="New York" type="Data Center" version="1.0"
LABEL 指令以label="value"
的形式出现。可以在每一条指令中指定一个或多个元数据,不同元数据用空格分隔。
10.STOPSIGNAL
功能:STOPSIGNAL指令用来设置停止容器时发送什么系统调用信号给容器。这个信号必须时内核系统调用表中合法的数。
11.ARG
功能:ARG指令用来定义可以在docker build
命令运行时传递给构建运行时的变量,我们只需咋构建时使用--build-arg
标志即可。用户只能在构建时指定在Dockerfile文件中定义过的参数。
例:
ARG build
ARG webapp_user=user
上面例子中第二条ARG指令设置了一个默认值,如果构建是没有为该参数指定值,就会使用这个默认值。
docker build --build-arg build=1234 -t test/webapp .
这里构建test/webapp竟像是,build变量将会设置为1234,而webapp——user变量则会继承设置的默认值user。
12.ONBUILD
功能:ONBUILD指令能为镜像台南佳触发器(trigger),当一个镜像被用作其他镜像的基础镜像时,该镜像中的触发器将会被执行。
ONBUILD触发器会按照在父镜像中指定的顺序执行,并且只能被继承一次(也就是说只能在子镜像中执行,而不会在孙子镜像中执行)
13.EXPOSE
功能:声明端口
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射 docker run -P
时,会自动随机映射 EXPOSE 的端口。