cmd指令用于一个容器启动时要运行的命令,这有点类似于RUN指令,只是RUN指令是指定镜像被构建时要运行的命令,而CMD是指定容器被启动时要运行的命令。这和使用docker run 命令启动容器时指定要运行的命令类似。
docker run -it jyh/static_web /bin/true
等价于
CMD ["/bin/true"]
给CMD指令传递参数,将-l标志传递给了/bin/bash命令。
CMD ["/bin/true","-l"]
docker run命令可以覆盖cmd命令,如果我们在Dockerfile厘米指定了CMD指令,通过在docker run 命令行中也指定了要运行的命令,命令行中的指令会覆盖Dockerfile中的CMD指令。
在Dockerfile中只能指定一条CMD指令,如果指定多个CMD指令,也只有一条CMD指令会被调用。如果想在启动容器时运行多个进程或者多条命令,可以考虑使用类似supervisor这样的服务管理工具。
ENTRYPOINT指令与CMD指令非常类似,也很容易和CMD指令弄混。
该指令提供的命令不容易在启动容器的时候被覆盖,事实上,docker run 命令指定的任何参数都会被当做参数传递给ENTRYPOINT指令。
指定ENTRYPOINT指令
ENTRYPOINT ["/usr/sbin/nginx"]
为ENTRYPOINT指令指定参数
通过给指令传入数组的方式可以来避免在命令前加入/bin/sh -c 带来的各种问题。
ENTRYPOINT["/usr/sbin/nginx","-g","daemon off;"]
WORKDIR指令用来在从镜像创建一个新容器时,在容器内部设置一个工作目录,上述ENTRYPOINT和CMD命令指定的程序都会在这个目录下执行。
可以使用该指令为Dockerfile中后续的一系列指令设置工作目录,也可以为最终的容器设置工作目录。
WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp
ENTRYPOINT ["rackup"]
这里为我们将工作目录切换为/opt/webapp/db后运行了budle install 命令,之后又设置了一次工作目录。
可以通过-w标志在运行时覆盖工作目录。
sudo docker run -it -w /var/log ubuntu pwd
ENV 指令用来在镜像构建过程中设置环境变量。
ENV RVM_PATH /home/xxx
这个新的环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样。
为RUN指令设置前缀
RUN gem install unicorn
添加ENV前缀后执行
RVM_PATH= /home/rvm gem install unicorn
也可以使用docker run 命令行的-e 来传递环境变量,但是这些变量只会在运行时有效。
sudo docker run -it -e "WEB_PORT=8080" ubuntu env
USER指令用来指定该镜像会以一个什么样的用户去运行。
USER nginx
上述命令的意思时会以nginx的用户身份来运行,我们可以指定用户名或者UID以及组或GID,也可以是两者的组合。
USER user
USER user:group
USER uid
USER uid:gid
......
如果不通过USER指令指定用户,默认用户为root
VOlUME指令用来向基于镜像创建的容器添加卷。一个卷是可以存在于一个或者多个容器内的特定的目录,这个目录可以绕过联合文件系统,并提供如下共享数据或者对数据进行持久话的功能。
卷的功能让我们可以将数据如源代码、数据库或者其他内容添加到镜像中而不是将这部分内容提交到镜像中,并向允许我们在多个容器间共享这些内容。我们可以利用该功能来测试容器和容器内部的应用程序代码,管理日志,或者处理容器内部的数据库。
VOlUME ["/opt/project"]
该指令将会为基于此镜像创建的任何容器创建一个名为/opt/project的挂载点。当然也可以通过指定数组的方式指定多个卷。
dokcer cp 和VOlUME指令,允许从容器赋值文件到复制文件到容器上。
ADD指令用来构建环境下的文件(宿主机的构建环境中的文件)和目录复制到镜像中。
ADD file1 file2
这里的指令会将构建目录下的file1文件复制到镜像中的file2中,指定源文件的位置参数可以是一个URL,或者构建上下文或者环境中文件名 或者目录。不能对构建目录或者上下文之外的文件进行ADD操作。
Docker通过目的地址参数末尾的字符判断文件源是目录还是文件,如果目标地址以/结尾,那么Docker就认为源地址指向的是目录。源地址同理。
ADD在处理本地归档文件时,会自动为归档文件解开(unpack)。
Dokcer解开归档文件的行为和使用带-x选项的tar命令一样。
ADD指令会使得构建缓存变得无效。
COPY指令类似于ADD,COPY只关心在构建上下文中复制本地的文件,而不会去做文件提取和解压的工作。
COPY conf.d /etc/apach2/
这个指令会将本地conf.d 目录中的文件复制到 /etc/apach2/ 目录中。
任何由docker指令创建的文件或者目录的UID和 GID都会设置未为0。
复制文件或者目录的时候会将元数据一同复制过去。
如果目的位置不存在,docker会自动创建目录结构,类似于mkdir -p
LABEL指令用于为Docker镜像添加元数据,元数据以键值对的形式展现。
LABEL version="1.0" //指定一个元数据
LABEL location="new york" type="data center" //指定多个元数据
推荐将所有的元数据都放在一条指令中,以防止不同的元数据指令创建过多镜像层。
可以通过docker inspect命令来查看docker镜像中的标签信息。
sudo docker inspect jamtur01/apache
STOPSIGNAL 指令用来设置停止容器时发生什么系统调用信号给容器。这个信号必须时内核系统调用表中和发的数,如9,或者SIGNAME格式中的信号名称,如SIGKILL。
ARG指令用来定义可以在docker build 命令运行时传递给构建运行时的变量,只需要在构建时使用–build-arg 标志即可。用户只能在构建时指定在Dockerfile文件中定义过的参数。
ARG build
ARG webapp_user=user
第二条指令设置了一个默认值,如果构建时没有为该参数指定值,就会使用这个默认值。
docker bulid --build--arg build=1234 -t jamtur01/webapp .
这里构建镜像时,build变量将会设置为1234 而webapp_user则会继承设置的默认值user
docker预定义了一组ARG变量,可以在构建时直接使用.
ONBUILD指令能为镜像添加触发器trigger,当一个镜像被用做其他镜像的基础镜像时(比如用户的镜像需要从某未准备号的位置添加源代码,或者用户需要执行特定于构建镜像的环境的构建脚本),该镜像的触发器将会被执行。
触发器会在构建过程中插入新指令,可以认为这些指令时紧跟在FROM之后指定的,触发器可以时任何构建指令。