之前我们提到,使用docker build
命令可以将 Dockerfile 生成镜像,Dockerfile 中的内容其实就是镜像生成的一个个步骤。
下面就是一个有效的 Dockerfile:
# 指定tomcat版本
FROM tomcat:8.5.32-jre8
# 指定工作目录
WORKDIR /app
# 将打包后的 server.jar 拷贝到镜像中
# 可以使用脉冲云的编译构建服务,在线将源码打包成 jar
ADD server.jar /app/server.jar
# 设置镜像的启动命令
CMD java -jar /app/server.jar
# 声明需要监听的端口
EXPOSE 8080
Dockerfile 中支持 # 开头的注释,然后就是一条条各种指令,下面我们一一了解下各种指令常用。
指定基础镜像,生成新镜像必须指定一个基础镜像,然后在此基础镜像上逐一运行随后的指令,最后生成新镜像,例如:
FROM ubuntu:16.04
在镜像内运行命令,注意,这是在镜像打包过程中运行的命令,不是启动容器后的命令。RUN 指令常常用来在镜像打包过程中安装软件,例如:
RUN apt-get update \
&& apt-get install nginx
可以使用转移符 \ 书写多行指令
RUN 其实调用的是标准的 shell,所以可以通过 && 连接执行多个命令
指定容器启动时执行的命令,注意,和 RUN 的区别是:RUN 是在打包过程中执行的命令。镜像中只能有一条 CMD 指令,如果有多个 CMD 指令,则以最后一条为准,所以我们可以覆盖基础镜像中定义的 CMD 指令。CMD 指令支持三种格式:
CMD ["executable", "param1", "param2"]
使用 exec 执行
CMD command param1 param2
使用/bin/sh -c
执行
CMD ["param1", "param2"]
提供给ENTRYPOINT
的默认参数
容器启动入口,即容器启动后执行的命令,不会被 CMD 指令覆盖,如果存在 ENTRYPOINT,那么 CMD 指令会充当 ENTRYPOINT 的参数。
ENTRYPOINT /app/entrypoint.sh
指定后续 RUN、CMD、ENTRYPOINT 程序的工作目录,可以多次执行,就像 Linux 的 cd 命令。
WORKDIR /app
WORKDIR data
RUN pwd # /app/data
指定后续 RUN、CMD、ENTRYPOINT 程序的用户名或 UID。
USER nginx
声明一个环境变量,可为后续的 RUN、CMD、ENTRYPOINT 程序所使用。
ENV JAVA_HOME /opt/java
声明容器需要暴露的端口号。
EXPOSE 80 443
声明容器运行时的数据卷挂载点,将主机目录挂载到容器中,用来持久化保存容器生成的数据。
VOLUME /app/data
将 Dockerfile 所在目录中的文件拷贝到镜像中,ADD <src> <dest>
,如果src
是一个 tar 包,那么会自动解压,并且src
支持网络路径。
ADD server.jar /app/server.jar
和 ADD 类似,格式为 ·COPY ` ,复制本地文件到容器中,和 ADD 区别是,不会自动解压,推荐使用 COPY。
COPY server.jar /app/server.jar
COPY . /app
COPY dist/* /app/
文章分享转载自脉冲云,谢谢