1.概述: Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。
2.Dockerfile的结构:一般来说,Dockerfile可分为如下4个部分:基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令
3.编写Dockerfile时的步骤:
step1 :一开始必须指明所基于的镜像名称。
step2 :接下来一般是说明维护者的信息。
step3 :接着是镜像操作指令,如RUN指令,RUN指令将对镜像执行跟随的命令,每运行一条RUN指令镜
像就添加
新的一层并提交。
step4 :最后是CMD指令,用来指定运行容器时的操作指令。
4.指令说明:
4.1、FROM : 指定所创建镜像的基础镜像,如果本地不存在,则会默认去Docker Hub下载指定镜像。
格式为 :FROM imageName:tag
FROM imageName
FROM imageName@digest bs:digest 为镜像的sha256sum值。
exp1 :FROM buildpack-deps:jessie-scm
exp2 :FROM nginx
exp3 :FROM nginx@a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6
4.2、MAINTAINER : 指定维护者信息。
格式为 :MAINTAINER 维护者信息(bs:此维护者信息会写入生成镜像的Author属性域中)
exp1 : MAINTAINER wzy_create@188178xxxx@163.com
4.3、RUN : 运行指定命令,在镜像生成过程中执行。
格式为 :RUN command
RUN ["executable" , "param1" , "param2" , ...............]
exp1 : RUN yum install iproute nginx && yum clean all 当命令较长的时候可以使用 \ 号来换行
exp2 : RUN apt-get update \
&& apt-get install -y libsnappy-dev zlib1g-dev libbz2-dev \
&& rm -rf /var/cache/apt
exp3 : RUN["bin/bash", "-c", "echo hello"]
4.4、CMD : 用来指定容器启动的时候默认执行的命令。
格式 :CMD["executable", "param1", "param2",.......] #使用exec执行,推荐。
CMD param1 param2 #在/bin/sh中执行,提供给需要交互的应用。
CMD["param1", "param2",.....] #提供给ENTRYPOINT的默认参数。
注意点 :Dockerfile只能有一条CMD命令,如果指定了多条只有最后一条会被执行。
4.5、LABEL : 用来指定生成镜像的元数据标签信息。
格式 :LABEL key=value key=value key=value ..........
exp1 : LABEL version="1.0" descript="update log style"
4.6、EXPOSE : 声明镜像内服务监听的端口。
格式 :EXPOSE port port port .........
exp1 : EXPOSE 8080 80 8443 443
注意点 :EXPOSE只是起到申明作用,并不会自动完成端口映射,启动容器的时候还是需要使用
-p指定端口映射,
-P则会随机指定端口映射。(随机指定宿主机端口与镜像服务监听端口映射)
4.7、ENV : 指定环境变量,在镜像生成过程中会被后续的RUN指令使用,在镜像启动的容器中也会存在。
格式 :ENV key=value key=value
ENV key value (只能一对,想要定义多个,再定义ENV key value)。
exp1 :ENV PG_MAJOR=9.3 PG_VERSION=9.3.4
exp2 : ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
注意点 :指令指定的环境变量在容器运行时可以被覆盖,如docker run --env PG_MAJOR=9.4 则容器内的此环境就是9.4。
4.8、ADD : 将复制指定的路劲下的内容到容器内的目标路径。
格式 :ADD src dest
#src 可以是此Dockerfile所在目录的一个相对路径(文件或目录),
也可以是一个url , 还可以是一个tar文件(如果是tar文件,会自动解压到dest路径下)。
#dest可以是容器内的绝对路径,或者相对于工作目录WORKDIR的相对路径。(路径支持正则表达式)。
exp1 : ADD *.java /code/ #将当前目录下的所有java文件复制到容器工作目录相对路为/code/的目录下。
4.9、COPY : 将复制指定的路劲下的内容到容器内的目标路径。跟ADD差不多,推荐使用COPY。
格式 :COPY src dest
#src 可以是此Dockerfile所在目录的一个相对路径(文件或目录),
也可以是一个url , 还可以是一个tar文件(如果是tar文件,会自动解压到dest路径下)。
#dest可以是容器内的绝对路径,或者相对于工作目录WORKDIR的相对路径,目标路径不存在时会自动创建
(路径支持正则表达式)。
4.10、ENTRYPOINT : 指定镜像的默认入口命令,该入口命令会在容器启动时作为根命令执行,
所有传入值作为该命令的参数,跟CMD相似但是会在CMD前面执行。
格式 : 跟CMD一致。
注意点 :Dockerfile 中只能有一个ENTRYPOINT ,指定多个的时候只会执行最后一个。
在运行的时候可以使用--entrypoint 覆盖此命令值。
4.11、VOLUME : 创建一个数据卷挂载点。
格式 :VOLUME["/test"]。
4.12、USER : 指定运行容器时的用户名或UID,后续的RUN指令也会使用指定用户身份。
格式为 :USER username
用法 :当服务不需要使用管理员权限时,可以使用该命令指定运行用户,但是在之前创建此用户。如:
RUN groupadd -r postgres && useradd -r -g postgres postgresUser1。
4.13、WORKDIR : 指定镜像的工作目录,为后续的RUN\CMD\ENTRYPOINT指令配置工作目录。
格式 :WORKDIR /path
注意点 :可以使用多个WORKDIR指令,但是后续的命令都是参数则是前面路径的相对路径,如:
WORKDIR /a
WORKDIR b
WORKDIR c
最终的工作目录为 /a/b/c
4.14、ARG : 指定一些镜像内使用的参数(如版本号等),这些参数在执行docker build 命令的时候才会以
--build-arg argname=value 格式传入。
格式 :ARG argName1[=value1] argName2[=value2]
4.15、ONBUILD : 配置当所创建的镜像作为其他镜像的基础镜像时,所执行的操作指令。
格式为 :ONBUILD 指令内容。
exp1 :ONBUILD ADD .java /app/src
exp2 :ONBUILD RUN rm -rf *
bs:如果我们的使用Dockerfile DA 构建了镜像A,而DA中有exp1跟exp2两条指令,而这时
我们使用DA作为Dockerfile DB的基础镜像(就是FROM DA),这个时候就相当于在DB中会是如下结果
FROM DB
ADD .java /app/src
RUN rm -rf * (注意三天语句一定是跟随的,中间不会有其他语句)。
4.16、STOPSIGNAL : 指定所创建的的镜像启动的容器接收退出的信号值。
exp1 : STOPSIGNAL stop
exp2 : STOPSIGNAL shirt_down
5、创建镜像:docker build ,该命令将读取指定路径下(包括子目录)的Dockerfile文件,并将路径下的所有内容发送给docker服务器,
由服务器来创建镜像。
-f 指定路径,不使用的话默认读取当前目录下(包括子目录)的Dockerfile文件。
-t 指定镜像名称