Dockerfile文件中可以包含大量的指令,例如:CMD、ENTRYPOINT、ADD、COPY、VOLUME、WORKDIR、USER、ONBUILD、ENV等。可以在
https://docs.docker.com/engine/reference/builder/查看所有Dockerfile可用的全部指令。
CMD
CMD 指定容器启动时要运行的命令,类似于RUN,但是RUN指定的是容器创建时要运行的命令。
例:
在Dockerfile文件中添加
CMD["/BIN/BASH","-L"]
容器启动时就会运行/bin/bash -l 命令。
- CMD指令可以被RUN指令覆盖
- 一个Dockerfile文件只能有一跳CMD指令,若有多条CMD指令出现的话,只有最后一条会被使用
ENTRYPOINT
docker run 命令行中指定的参数会被默认传递给ENTRYPOINT指令指定的指令作为其参数使用。
例:
在Dockerfile文件中添加:
ENTRYPOINT ["/usr/sbin/nginx"]
当我们执行
docker run -it zhangyang/static_web -g "daemon off;"
时,指定的-g “daemon off;”会被当作参数传递给 /usr/sbin/nginx
当CMD 和ENTRYPOINT指令结合起来使用时会很巧妙。
例:
在Dockerfile文件中添加:
ENTRYPOINT ["/usr/sbin/nginx"] CMD ["-h"]
然后运行
docker run -it zhangyang/static_web -g "daemon off;"
参数会让nginx守护进程以前台方式运行。若启动时不指定任何参数,则会把CMD指定的参数传递给ENTRYPOINT,即把-h传递给nginx,显示nginx的帮助信息
WORKDIR
该指令会指定镜像创建时指定指令的工作目录。
例:
在Dockerfile文件中添加如下代码:
WORDDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp
ENTRYPOINT ["rackup"]
意思是我们在/opt/webapp/db目录下运行了bundle install命令,然后切换到/opt/webapp设置了ENTRYPOINT 指令来启动rackup指令
我们也可以在启动容器时使用-w选项来覆盖WORKDIR的设置:
docker run -it -w /var/log ubuntu pwd
该命令会将容器的工作目录设置为/var/logs
ENV
ENV指令用来设置环境变量
ENV RVM_PATH /home/rvm/
USER
USER指定该镜像以哪个用户去运行。
可以使用一下几种方式指定:
USER user:group
USER uid:gid
USER user :gid
USER uid:group如果不用USER指定,默认使用root用户
VOLUME
VOLUME用于向新创建的容器添加卷。
卷功能允许我们在多个容器之间共享卷以及卷中的代码、数据库等内容,而且对卷的修改时及时生效的。
卷会一直存在直到没有容器在使用它。
代码示例:
VOLUME ["/opt/hello"]
该代码会在基于此镜像创建的任何容器创建一个名为/opt/hello的挂载点
ADD
ADD指令将构建环境下的文件和目录复制到镜像中。
例:
在Dockerfile文件中添加下述代码:
ADD software.lic /opt/app/software.lic
该指令会将构建目录下的文件复制到容器的/opt/app/software.lic
ADD指令也可以使用URL的格式指定源文件
- ADD的源文件如果是一个归档文件的话,复制到容器中时会自动解压缩。例:
ADD hello.gz /var/hello/
- 新创建的文件和目录的模式为0755,GID和UID都是0
ADD指令会使构建缓存变得无效。也就是说如果ADD了一个新文件或目录到镜像中,那么该指令后面的所有指令都无法使用构建缓存。
COPY
类似于ADD,唯一的区别是不会自动解压缩归档文件
ONBUILD
ONBUILD被称为触发器指令,触发器会指定一个特定指令,该指令会紧跟在FROM指令之后执行。
例:
在Dockerfile文件中添加下述代码:
ONBUILD ADD . /app/src
ONBUILD RUN cd /app/src && make
然后依据此Dockerfile文件创建容器时,显示如下:
docker build -t="zhangyang/apache2" .
需要注意的是,ONBUILD触发器会按照在父镜像指定的顺序执行,并且只能被继承一次,即只会在子镜像中执行,不会被孙镜像中执行。
docker命令结构图:
docker子命令分类:
docker环境信息: info、version
容器生命周期管理:create、exec、kill、pause、restart、rm、run、start、stop、unpause
镜像管理:build、images、import、load、rmi、save、tag、commit
容器运维操作:attach、export、inspect、port、ps、rename、stats、top、wait、cp、diff
系统日志信息:events、history、logs