Dockerfile 语法详解
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
- 使用docker build 构建镜像
- docker build -f 可以指定具体的dockerfile文件
FROM centos
MAINTAINER xianchao
RUN rm -rf /etc/yum.repos.d/*
COPY Centos-vault-8.5.2111.repo /etc/yum.repos.d/
RUN yum install wget -y
RUN yum install nginx -y
COPY index.html /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
#构建镜像
docker build -t="dockerfile/test-cmd:v1"
#运行容器
docker run -p 80 --name cmd_test2 -d dockerfile/test-cmd:v1
语法
-
FROM。基础镜像,必须是可以下载下来的,定制的镜像都是基于FROM 的镜像,这里的centos就是定制需要的基础镜像。后续的操作都是基于centos镜像。
-
MANTAINER。指定镜像的作者信息
-
RUN。指定在当前镜像构建过程中要运行的命令包含两种模式:
- shell。 RUN 。 例:RUN echo hello
- exec。 RUN [“executable”, “paraml”, “param2”]。例: RUN [“/bin/bash”, “-c”, “echo hello”],等价于 /bin/bash -c echo hello
-
EXPOSE。仅仅只是声明端口。格式: EXPOSE <端口1> [<端口2>…]
作用:
- 帮助镜像使用者理解景象服务的守护端口,以方便配置映射。
- 在运行时使用随机端口映射时,也就是docker run -p 时, 会自动随机映射EXPOSE端口
- 可以是一个或者多个端口,也可以指定多个EXPOSE
-
CMD。类似于RUN指令,用于运行程序,但二者运行的时间点不同:
- CMD在docker run 时运行。
- RUN是在docker build 构建镜像时运行
CMD [“/usr/sbin/nginx”, “-g”, “daemon off;”]
-
ENTERYPOINT。类似CMD指令,用于传参。但不会被docker run 的命令行参数指定的指令所覆盖。所以ENTERYPOINT一般传定参,CMD一般传变参。
FROM nginx
ENTERYPORINT ["nginx", "-c"] #定参
CMD ["/etc/nginx/nginx.conf"] #变参
-
COPY。复制命令。 格式:COPY [–chown=:] …
可以使用通配符。满足go语言的表达方式。
- COPY hom* /mkdir
- COPY hom?.txt /mkdir
-
ADD。拷贝的另一种方式。格式:ADD …
优点:再执行<源文件>为tar压缩文件的话,压缩格式为gzip,bzip2以及xz的情况下,自动复制并解压到<目标路径>
缺点:在不解压的前提下,无法复制tar压缩文件。会令镜像构建缓存失效,从而可以会令镜像构建缓慢。
-
VOLUME。定义匿名数据卷,在启动容器时忘记挂在数据卷,会自动挂在到匿名卷。格式:VLOLUME <路径>
作用:1.避免重要的数据,因容器重启而丢失。2.避免容器不断变大
-
WORKDIR。指定工作目录。
-
ENV。设置环境变量。格式:ENV 或 ENV =
-
USER。制定执行后续命令的用户和用户组,只是用于切换后续命令执行的用户和用户组(因此改用户和用户组必须提前已经存在)。 格式:USER <用户名>[:<用户组>]
-
ONBUILD。触发器,就是在本次构建过程中不会执行该命令,但有新的dockerfile使用了之前构建的镜像时,才会触发。
-
LABEL。打标签。格式:LABEL
-
HEALTHCHECK。健康检查。
-
ARG。构建参数。与ENV作用一致,但ARF警队Dockerfile内有效,也就是说只有docker build的过程中有效,构建好的镜像内不存在此环境变量。构建命令docker build 中可以使用 --build-arg =来覆盖。格式:ARG <参数名>[=<默认值>]