本文介绍: 在Dockerfile中,有一些关键字或指令是被认定为保留字的,它们具有特殊的含义,用于定义Docker镜像的构建过程。指令告诉 Docker 如何从基础镜像创建一个新的镜像。

目录

一、Dockerfile保留字是什么?

二、Docker构建流程

1. 从基础镜像运行容器


在 Dockerfile 中,有一些关键字或指令是被认定为保留字的,它们具有特殊的含义,用于定义 Docker 镜像的构建过程。指令告诉 Docker 如何从基础镜像创建一个新的镜像。

  • Docker 引擎从指定的基础镜像开始创建一个新的容器实例。
  • Dockerfile 中的每个指令都会导致容器内部的文件系统、环境变量等发生相应的修改。
  • 当容器内的修改达到一个阶段时,可以执行 docker commit 或类似的操作,将容器的状态保存为一个新的镜像层。
  • 这个新的镜像层包含了容器的变更,形成一个新的镜像。
  • 使用刚刚创建的新镜像,Docker 引擎再次运行一个新的容器实例。
  • Docker 引擎在新容器内执行 Dockerfile 中的下一条指令,导致新的修改和状态。
  • 迭代上述过程,逐步执行 Dockerfile 中的每一条指令,每次都可能创建一个新的镜像层。
  • 当 Dockerfile 中的所有指令都被成功执行后,得到的最终镜像即为包含了所有修改和变更的最终版本

1. FROM 使用基础镜像作为起点

Dockerfile第一条必须是FROM

# 使用基础镜像作为起点
FROM ubuntu:20.04
LABEL version="1.0" description="My Docker Image" maintainer="your_name <your_email@example.com>"

ps:MAINTAINER:指定镜像的维护者

Docker 1.13 被标记为已弃用,指定镜像的维护者(建议使用 LABEL 替代) 

因为 Docker 社区更倾向于使用 LABEL 来提供元数据

MAINTAINER your_name <your_email@example.com>
USER 【userName】

在镜像中执行命令,更新软件包列表并安装一些软件包

两种格式:

  • shell格式
  • exec格式
COPY 【源路径】【容器路径】

将宿主机目录下(或远程文件)的文件拷贝进镜像,且会自动处理URL和解压tar压缩包。

ADD https://example.com/file.tar.gz /tmp/

# 设置工作目录,后续命令将在该目录下执行

WORKDIR /app
# 格式 ENV 环境变量名 环境变量值
# 或者 ENV 环境变量名=值
ENV MY_PATH /usr/mytest

# 使用环境变量
WORKDIR $MY_PATH
EXPOSE 80

ENTRYPOINT可以和CMD一起用,一般是可变参数才会使用CMD,这里的CMD等于是在给ENTRYPOINT传参。

当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行期命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令,它们两个组合会变成 <ENTRYPOINT> “<CMD>”。

FROM nginx

ENTRYPOINT ["nginx", "-c"]  # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参

对于此Dockerfile,构建成镜像 nginx:test后,如果执行;

docker run nginx test,则容器启动后,会执行 nginx -c /etc/nginx/nginx.conf 

docker run nginx:test /app/nginx/new.conf,则容器启动后,会执行 nginx -c /app/nginx/new.conf

指定容器启动后要干的事情。

有两种格式:

  • shell格式
# CMD <命令>
CMD echo "hello world"
  • exec格式
# CMD ["可执行文件", "参数1", "参数2" ...]
CMD ["catalina.sh", "run"]
  • 与ENTRYPOINT指令配合使用
# CMD ["参数1", "参数2" ....],与ENTRYPOINT指令配合使用

容器数据卷,用于数据保存和持久化工作。类似于 docker run 的-v参数。

VOLUME 挂载点

挂载点可以是一个路径,也可以是数组

ps:数组中的每一项必须用双引号

VOLUME /var/lib/mysql

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注