Dockerfile保留字

目录

一、Dockerfile保留字是什么?

二、Docker构建流程

[1. 从基础镜像运行容器](#1. 从基础镜像运行容器)

[2. 执行指令并修改容器](#2. 执行指令并修改容器)

[3. 提交新的镜像层](#3. 提交新的镜像层)

[4. 基于新镜像运行新容器](#4. 基于新镜像运行新容器)

[5. 执行下一条指令](#5. 执行下一条指令)

[6. 循环执行指令](#6. 循环执行指令)

[7. 所有指令执行完成](#7. 所有指令执行完成)

三、保留字

[1. FROM 使用基础镜像作为起点](#1. FROM 使用基础镜像作为起点)

[2. LABEL 指定镜像的维护者信息](#2. LABEL 指定镜像的维护者信息)

[3. USER 指定的用户](#3. USER 指定的用户)

[4. RUN 容器构建时需要运行的命令](#4. RUN 容器构建时需要运行的命令)

[5. COPY 复制本地文件或目录到镜像中](#5. COPY 复制本地文件或目录到镜像中)

[6. ADD 将文件的文件拷贝进镜像](#6. ADD 将文件的文件拷贝进镜像)

[7. WORKDIR 设置工作目录](#7. WORKDIR 设置工作目录)

[8. ENV 设置环境变量](#8. ENV 设置环境变量)

[9. EXPOSE 当前容器对外暴露出的端口](#9. EXPOSE 当前容器对外暴露出的端口)

[10. ENTRYPOINT 用来指定一个容器启动时要运行的命令](#10. ENTRYPOINT 用来指定一个容器启动时要运行的命令)

[11. CMD 定义容器启动时运行的默认命令](#11. CMD 定义容器启动时运行的默认命令)

[12. VOLUME 容器数据卷](#12. VOLUME 容器数据卷)


一、Dockerfile保留字是什么?

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

二、Docker构建流程

1. 从基础镜像运行容器

  • Docker 引擎从指定的基础镜像开始创建一个新的容器实例。

2. 执行指令并修改容器

  • Dockerfile 中的每个指令都会导致容器内部的文件系统、环境变量等发生相应的修改。

3. 提交新的镜像层

  • 当容器内的修改达到一个阶段时,可以执行 docker commit 或类似的操作,将容器的状态保存为一个新的镜像层。
  • 这个新的镜像层包含了容器的变更,形成一个新的镜像。

4. 基于新镜像运行新容器

  • 使用刚刚创建的新镜像,Docker 引擎再次运行一个新的容器实例。

5. 执行下一条指令

  • Docker 引擎在新容器内执行 Dockerfile 中的下一条指令,导致新的修改和状态。

6. 循环执行指令

  • 迭代上述过程,逐步执行 Dockerfile 中的每一条指令,每次都可能创建一个新的镜像层。

7. 所有指令执行完成

  • 当 Dockerfile 中的所有指令都被成功执行后,得到的最终镜像即为包含了所有修改和变更的最终版本

三、保留字

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

Dockerfile第一条必须是FROM

bash 复制代码
# 使用基础镜像作为起点
FROM ubuntu:20.04

2. LABEL 指定镜像的维护者信息

bash 复制代码
LABEL version="1.0" description="My Docker Image" maintainer="your_name <your_email@example.com>"

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

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

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

bash 复制代码
MAINTAINER your_name <your_email@example.com>

3. USER 指定的用户

指定该镜像以什么样的用户去执行,如果不指定,默认是root

bash 复制代码
USER 【userName】

4. RUN 容器构建时需要运行的命令

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

两种格式:

  • shell格式

    等同于在终端操作的shell命令

    格式:RUN <命令行命令>

    RUN yum -y install vim

  • exec格式

    格式:RUN ["可执行文件" , "参数1", "参数2"]

    RUN ["./test.php", "dev", "offline"] # 等价于 RUN ./test.php dev offline

RUN是在docker build时运行

5. COPY 复制本地文件或目录到镜像中

bash 复制代码
COPY 【源路径】【容器路径】

6. ADD 将文件的文件拷贝进镜像

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

bash 复制代码
ADD https://example.com/file.tar.gz /tmp/

7. WORKDIR 设置工作目录

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

bash 复制代码
WORKDIR /app

8. ENV 设置环境变量

用来在构建镜像过程中设置环境变量。

这个环境变量可以在后续的任何RUN指令或其他指令中使用

bash 复制代码
# 格式 ENV 环境变量名 环境变量值
# 或者 ENV 环境变量名=值
ENV MY_PATH /usr/mytest

# 使用环境变量
WORKDIR $MY_PATH

9. EXPOSE 当前容器对外暴露出的端口

bash 复制代码
EXPOSE 80

10. ENTRYPOINT 用来指定一个容器启动时要运行的命令

类似于CMD命令,但是ENTRYPOINT不会被docker run后面的命令覆盖,这些命令参数会被当做参数送给ENTRYPOINT指令指定的程序。

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

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

bash 复制代码
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

11. CMD 定义容器启动时运行的默认命令

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

有两种格式:

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

12. VOLUME 容器数据卷

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

bash 复制代码
VOLUME 挂载点

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

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

bash 复制代码
VOLUME /var/lib/mysql
相关推荐
昌sit!2 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
追风林3 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
A ?Charis5 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
城南vision5 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wclass-zhengge5 小时前
Docker篇(Docker Compose)
运维·docker·容器
北漂IT民工_程序员_ZG6 小时前
k8s集群安装(minikube)
云原生·容器·kubernetes
梦魇梦狸º9 小时前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github
鬼才血脉9 小时前
docker+mysql配置
mysql·adb·docker
詹姆斯爱研究Java9 小时前
Docker 的基本概念和优势
docker
南猿北者11 小时前
docker镜像仓库常用命令
运维·docker·容器