Dockerfile常用指令
1,CMD
CMD指令用于指定一个容器启动时要运行的命令。如下例子将-1标志传递给/bin/true命令。在Dockerfile中只能指定一条CMD指令 。如果想在启动容器时运行多个进程或者多条命令,可以考虑使用类似Supervisor服务管理工具。
CMD ["/bin/true","-1"]
2,ENTRYPOINT
ENTRYPOINT指令与CMD指令非常类似,也很容易和CMD指令弄混。这两个指令区别,我们可以在docker run命令行中覆盖CMD指令,ENTRYPOINT指令不能覆盖。docker run命令行中指定的任何参数都会被当做参数再次传递给ENTRYPOINT指令中指定的命令。docker run --entrypoint覆盖ENTRYPOINT指令。通过以数组方式指定ENTRYPOINT在想运行的命令前加入/bin/sh -c来避免各种问题。
ENTRYPOINT ["/usr/sbin/nginx"] ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
3,WORKDIR
WORKDIR指令用来在从镜像创建一个新容器时,在容器内部设置一个工作目录,ENTRYPOINT和/或CMD指定的程序会在这个目录下执行。
WORKDIR /opt/webapp/db RUN bundle install WORKDIR /opt/webapp ENTRYPOINT ["rackup"]
4,ENV
ENV指令用来在镜像构建过程中设置环境变量
ENV RVM_PATH /home/rvm
5,USER
USER指令用来指定该镜像会以什么样的用户去运行。默认用户为root。docker run -u覆盖指令的值
USER user:group
USER uid:gid
6,VOLUME
VOLUME指令用来向基于镜像创建的容器添加卷。一个卷是可以存在于一个或者多个容器内的特定的目录,这个目录可以绕过联合文件系统,并提供如下共享数据或者对数据进行持久化的功能。
- 卷可以在容器间共享和重用
- 一个容器可以不是必须和其他容器共享卷
- 对卷的修改是立时生效的
- 对卷的修改不会对更新镜像产生影响
- 卷会一直存在直到没有任何容器再使用它
VOLUME ["/opt/project","/data"]
docker cp是和VOLUME指令相关并且也是很实用的命令。该命令允许从容器复制文件和复制文件到容器上
7,ADD
ADD指令用来将构建环境下的文件和目录复制到镜像中。ADD会自动将归档文件解开。
ADD software.lic /opt/application/software.lic
ADD latest.tar.gz /var/www/wordpress
8,COPY
COPY指令非常类似于ADD,它们根本的不同是COPY只关心在构建上下文中复制本地文件,而不会去做文件提取(extraction)和解压(decompression)的工作。
COPY conf.d/ /etc/apache2/
9,LABEL
LABEL指令用于为Docker镜像添加元数据。元数据以键值对的形式展现。LABEL指令在Docker1.6版本中引入。
LABEL version="1.0" LABEL location="New York" type="Data Center" role="Web Server"
使用docker inspect命令查看容器标签
docker inspect jamtur01/apache2
10,STOPSIGNAL
STOPSIGNAL指令用来设置停止容器时发送什么系统调用信号给容器。这个信号必须是内核系统调用表中合法的数,如9,或者SIGNAME格式中的信号名称,如SIGKILL。
STOPSIGNAL指令是在Docker1.9版本中引入的。
11,ARG
ARG指令用来定义可以在docker build命令运行时传递给构建运行时的变量,我们只需要在构建时使用--build-arg标志即可。用户只能在构建时指定在Dockerfile文件中定义过的参数。ARG指令在Docker1.9版本中引入。
ARG build
ARG webapp_user=user
预定义ARG变量
HTTP_PROXY
http_proxy
HTTPS_PROXY
https_proxy
FTP_PROXY
ftp_rpoxy
NO_PROXY
no_proxy
12,ONBUILD
ONBUILD指令能为镜像添加触发器。当一个镜像被用做其他镜像的基础镜像时,该镜像中的触发器将会被执行。
ONBUILD ADD ./app/src ONBUILD RUN cd /app/src && make
13,FROM
FROM指令指定一个已经存在的镜像,后续指令都将基于该镜像进行,这个镜像被称为基础镜像(base image)。在运行一个容器时,必须要指明是基于哪个基础镜像在进行构建。
FROM ubuntu:14.04
14,MAINTAINER
MAINTAINER指令会告诉Docker该镜像的作者是谁,以及作者的电子邮件地址。
MAINTAINER James Turnbull “james@example.com”
15,RUN
RUN指令会在构建当前镜像中运行指定的命令。每条RUN指令都会创建一个新的镜像层,如果该指令执行成功,就会将此镜像层提交,之后继续执行Dockerfile中的下一条指令。默认情况下,RUN指令会在shell里使用命令包装器/bin/sh -c来执行。如果是在一个不支付shell的平台上运行或者不希望在shell中运行(比如避免shell字符串慕改),也可以使用exec格式的RUN命令。
RUN ["apt-get","install","-y","nginx"] RUN apt-get update && apt-get install -y nginx
16,EXPOSE
EXPOSE指令告诉Docker该容器内的应用程序将会使用容器的指定端口。这并不意味着可以自动访问任意容器运行中服务的端口。出于安全的原因,Docker并不会自动打开该端口,而是需要用户在使用docker run运行容器时来指定需要打开哪些端口。可以指定多个EXPOSE指令来向外部公开多个端口。