Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 | ENV key value |
ENV | 设置环境变量,可在后面指令使用 | COPY./jre11.tar.gz /tmp |
COPY | 拷贝本地文件到镜像的指定目录 | |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN tar -zxvf /tmp/jre11.tar.gz&& EXPORTS path=/tmp/jre11:Spath |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
FROM 功能为指定基础镜像,并且必须是第一条指令。 如果不以任何镜像为基础,那么写法为:FROM scratch。 同 时意味着接下来所写的指令将作为镜像的第一层开始
RUN 功能为运行指定的命令
注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层. 多少个RUN就构建了多 少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。 RUN书写时的换行 符是\
- CMD 功能为容器启动时要运行的命令
注意:补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。 原因是参数传递后,docker解析的是一个JSON array
RUN和CMD的区别 不要把RUN和CMD搞混了。 RUN是构件容器时就运行的命令以及提交运行结果 CMD是容器启动时执行的命 令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子
LABEL 功能是为镜像指定标签,为镜像写一些注释信息
但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号 如下:
注意:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖
- EXPOSE 指定于外界交互的端口 功能为暴漏容器运行时的监听端口给外部 但是EXPOSE并不会vim 使容器访问主机的端口 如果想使得容器与主 机的端口有映射关系,必须在容器启动的时候加上 -P参数
注意:如果在端口号后面加/tcp,默认为tcp协议,如果需要UDP端口需要添加/udp
ENV 功能为设置环境变量
ADD 一个复制命令,把文件复制到镜象中。 如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似 于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。
注意:尽量不要把写成一个文件夹,如果是一个文件夹了,复制整个目录的内容,包括文件系统元数据
- WORKDIR 设置工作目录,对R
UN,CMD,ENTRYPOINT,COPY,ADD
生效。如果不存在则会创建,也可以设置多次WORKDIR:
工作目录,类似于cd命令 格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a
(这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b
)
WORKDIR c (这时工作目录为/a/b/c
)
VOLUME 用于指定持久化目录 可实现挂载功能,可以将内部文件夹挂载到外部
ENTRYPOINT 该命令与CMD类似,用于执行命令使用,还可以与CMD命令一起拼合使用
它与CMD的区别: 相同点:只能写一条,如果写多条,那么只有最后一条生效
不同点:CMD在创建容器时,在后面添加其他的CMD指令,CMD会被覆盖,但是ENTRYPOINT不会被覆盖,如果两个同时使用,CMD会变成ENTRYPOINT的参数
dockerFile实例
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
#指定基础镜像
FROM ubuntu:16.04
#配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR && tar -xf ./jdk8.tar.gz&& mv ./jdk1.8.0_144 ./java8
#配置环境变量
ENV JAVA_HOME=SJAVA_DIR/java8
ENV PATH=SPATH:SJAVA_HOME/bin
# 入口,java项目的启动命令
ENTRYPOINT ["java","-jar","/app.jar"]