dockefile 指令解释
#除了注释行之外的第一行,必须是 From xxx (xxx 是基础镜像)
#第一行先定义基础镜像,后面的本地有效的镜像名,如果本地没有会从远程仓库下载
From centos
#镜像维护者的信息
MAINTAINER zt 25958889@qq.com
#指定该容器运行时的用户名和 UID,后续的 RUN 命令也会使用这面指定的用户执行
USER xx
WORKDIR /a
WORKDIR b #指定工作目录,最终为/a/b ,通常很少使用workdir 而使用RUN cd代替
#设置容器挂载主机目录 ,创建一个可以从本地主机或其他容器挂载的挂载点,可以把主机的文件映射到容器。
VOLUME ["/dir_1", "/dir_2" ..]
#设置容器变量,常用于想容器内传递用户密码等 ,在容器运行之后可以用echo $变量名 查看
ENV name zt
#RUN用于执行from 镜像中的原生shell 命令
RUN yum install nginx
#拷贝本地(默认和Dockerfile在一个目录)的文件拷贝到容器镜像中
COPY src dest
COPY check* /testdir/
#ADD自动解压和dockerfile在一个目录的压缩包到容器指定目录。 解压目录如果不存在会自动创建
ADD nginx-1.10.3.tar.gz /usr/local/src/
#向外开放的端口,多个端口用空格做间隔,启动容器时候-p 需要使用此端向外映射,可以是多个端口
EXPOSE 80 443
#运行的命令,每个 Dockerfile 只能有一条,如果有多条则只有最后一条被执行
#如果在从该镜像启动容器的时候也指定了命令,那么指定的命令会覆盖
#Dockerfile 构建的镜像里面的 CMD 命令,即指定的命令优先级更高,Dockerfile 的优先级较低一些
CMD ["nginx"]
注意:
写dockerfile 的指令之前 ,可以先起一个父镜像的容器,在这个容器里,先把操作执行一遍,如果没有问题。就把操作写成对应的dockerfile 指令即可。
通常dockefile 不可能一步编写完成,可以把docker build 命令写好放在一个脚本中。每完成一部分就可以执行一下改脚本,确认是否有错误。
在满足业务需求的情况下,可以精简镜像。每条dockerfile中的指令都是镜像中的一层,可以把多条功能相似的命令合并为一条,或者用&&连接起来。然后,可以把构建完成之后的不需要的命令相关软件包都可以删了。这样也可以减小容器体积。 当然,可以选择合适的更小的底层镜像,如alpine。
在写dockerfile 时, 要把不经常变动的指令写在前面 ,如ENV之类的,这样的好处是可以提升构建镜像时的数度。当你第一次构建镜像之后,第二次前n行没有改,那么前n行就不用重写构建了。