Dockerfile 制作镜像的常用指令

Dockerfile 指令清单

更多更详细指令:官网 Dockerfile reference | Docker Docs

Dockerfile 指令 功能
FROM 指定基础镜像
RUN 在镜像构建过程中执行命令
COPY 将文件或目录从构建环境复制到镜像中
ADD 类似于 COPY,但更强大,支持 URL 和解压缩操作
WORKDIR 设置工作目录
ENV 设置环境变量
ARG 定义构建时的参数
EXPOSE 声明容器运行时要监听的端口
VOLUME 创建挂载点,用于持久化数据
CMD 指定容器启动时要运行的默认命令
ENTRYPOINT 配置容器启动时执行的命令
LABEL 添加元数据,用于标记镜像
USER 设置容器中运行命令的用户
SHELL 配置 shell 类型

在包含 Dockerfile 文件的目录中执行以下命令:

yml 复制代码
docker build -t <image_name>:<tag>  <path_to_dockerfile_directory>
  • -t <image_name>:<tag> 用于指定构建的镜像名称及标签。
  • <path_to_dockerfile_directory> 是 Dockerfile 所在的目录路径。

2. FROM 指令

FROM 指令初始化一个新的构建阶段,并为后续指令设置基础镜像。因此,一个有效的 Dockerfile 必须以 FROM 指令开头。镜像可以是任何有效的镜像。

css 复制代码
FROM [--platform=<platform>] <image> [AS <name>]
  • 参数
    • <platform>: 构建的 cpu 架构,如 Linux/amd 64,Linux/arm 64。
    • <image>: 指定 base image 的名称。
    • AS <name>: 指定构建步骤的名称。

3. LABEL 指令

  • 为镜像添加元数据,元数据为键值对的形式。
yml 复制代码
LABEL <key>=<value> <key>=<value> <key>=<value> ...

比如

yml 复制代码
LABEL author="xiaoming" version="1.0" desc="create ubuntu demo1"

4. COPY 指令

  • 用于从 docker 主机复制新文件或者目录至创建的新镜像指定路径中。
yml 复制代码
COPY [--chown=<user>:<group>] [--chmod=<perms>] <src>... <dest>
# 或
COPY [--chown=<user>:<group>] [--chmod=<perms>] ["<src>",... "<dest>"]
  • <src> 是构建环境中要复制的文件或目录的路径。
  • <dest> 是要将文件或目录复制到容器中的目标路径。

除了基本的格式之外,COPY 指令还支持一些参数来指定复制行为:

  1. -chown=<user>:<group>:设置文件的所有者和组。例如 -chown=root:root
  2. --from=<source_stage>:从之前的构建阶段(指定的构建阶段或者镜像)复制文件。这个参数可以让你从一个镜像或者构建阶段中复制文件到当前的镜像。这对于多阶段构建非常有用。
  • 案例:

创建一个 Dockerfile 文件,内容如下。

yml 复制代码
FROM ubuntu:22.04 as demo1
LABEL author="xiaoming" version="1.0" desc="create ubuntu demo1"
COPY ./index.html /data/web/html/ 
  1. 使用 FROM ubuntu:22.04 as demo1 指令,表示初始化一个新的构建阶段,并以 ubuntu:22.04 镜像作为基础镜像,并将该阶段命名为 demo1
  2. 使用 LABEL 指令,添加元数据信息。author="xiaoming" 表示作者为 "xiaoming";version="1.0" 表示版本为 "1.0";desc="create ubuntu demo1" 表示描述为 "create ubuntu demo 1"。
  3. 将主机中的当前目录下的 index.html 文件拷贝到容器的 /data/web/html/ 目录中。

5. ENV 指令

yml 复制代码
ENV <key1>=<value1> <key2>=<value2> ...

其中 <key> 是环境变量的名称,<value> 是环境变量的值。这种格式用于设置单个环境变量,也可以使用通配符。

dockerfile 复制代码
FROM ubuntu:22.04 as demo1
LABEL author="xiaoming" version="1.0" desc="create ubuntu demo1"
ENV MYROOTDIR=/data/web/html/
# 使用通配符引用 MYROOTDIR
COPY ./index.html ${MYROOTDIR} 
ENV MYTEST=1

6.WORKDIR

WORKDIR 指令用于设置工作目录,即在容器中执行后续命令的默认目录。

dockerfile 复制代码
WORKDIR <directory>

其中 <directory> 是要设置为工作目录的路径。可以使用绝对路径或相对路径。如果指定的路径不存在,WORKDIR 指令将创建该目录。

dockerfile 复制代码
FROM ubuntu:22.04 as demo1
LABEL author="xiaoming" version="1.0" desc="create ubuntu demo1"
# 指定工作目录
WORKDIR /data/src

构建这个镜像,并启动。

WORKDIR 指令的作用是设置容器中执行后续命令的默认工作目录。它影响接下来所有命令执行的上下文环境,使得在Docker 容器中执行命令时不必每次都指定完整的路径。

7. ADD

ADD 指令用于将本地文件、目录、或远程文件 URL 添加到镜像中。它类似于 COPY 指令,但具有更多的功能,比如会它可以解压和下载。

dockerfile 复制代码
ADD <source> <destination>

其中 <source> 是要添加到镜像中的文件、目录或 URL,而 <destination> 是文件系统中的目标路径。

dockerfile 复制代码
FROM ubuntu:22.04 as demo1

LABEL author="xiaoming" version="1.0" desc="create ubuntu demo1"

WORKDIR /data/src

# 将nginx的源代码下载到当前目录(/data/src)

ADD https://nginx.org/download/nginx-1.24.0.tar.gz .

也可以再进行解压(过程就不展示了)。

dockerfile 复制代码
FROM ubuntu:22.04 as demo1

LABEL author="xiaoming" version="1.0" desc="create ubuntu demo1"

WORKDIR /data/src

# 将nginx的源代码下载到当前目录(/data/src)

ADD https://nginx.org/download/nginx-1.24.0.tar.gz .

# 解压到当前目录(/data/src)

ADD ./nginx-1.24.0.tar.gz .

8.RUN

RUN 指令用于在镜像构建过程中执行命令。它可以执行任何有效的 shell 命令、可执行文件或脚本。其基本格式为:

dockerfile 复制代码
RUN <command> && <command> ......

其中 <command> 是要执行的命令。在 Dockerfile 中可以是任何合法的 shell 命令,例如安装软件包、运行脚本、创建目录等。

dockerfile 复制代码
FROM ubuntu:22.04 as demo1
LABEL author="xiaoming" version="1.0" desc="create ubuntu demo1"
WORKDIR /data/src
# 将nginx的源代码下载到当前目录(/data/src)
ADD https://nginx.org/download/nginx-1.24.0.tar.gz .
# 执行 cd 与 tar 命令
RUN cd /data/src && tar zxvf nginx-1.24.0.tar.gz

9. CMD

CMD 是 Dockerfile 中的一条指令,用于设置容器启动时默认执行的命令。它定义了容器启动时执行的主要命令,但是可以被 Docker 命令行中的 docker run 中的参数覆盖。

dockerfile 复制代码
CMD command param1 param2

10. EXPOSE

EXPOSE 是 Dockerfile 中的一条指令,用于声明容器运行时要监听的端口。这个指令并不会实际打开端口或者创建端口映射,它只是告诉 Docker 容器内部运行的应用程序应该监听哪些端口。

dockerfile 复制代码
EXPOSE <port> [<port>/<protocol>...]

其中 <port> 是要暴露的端口号,<protocol> 是要使用的网络协议,通常是 tcpudp。如果未指定协议,则默认为 tcp

11. ENTRYPOINT

ENTRYPOINT 是 Dockerfile 中的一条指令,用于配置容器启动时执行的命令。与 CMD 不同,ENTRYPOINT 指令设置的命令不会被 Docker 命令行中的 docker run 中的命令覆盖,而是会作为容器的主要命令执行。

dockerfile 复制代码
ENTRYPOINT ["executable", "param1", "param2"]

比如:

dockerfile 复制代码
ENTRYPOINT nginx -g 'daemon off;'

12. VOLUME

用于创建一个挂载点,并将该挂载点中的数据持久化保存。

dockerfile 复制代码
VOLUME ["<路径>","<路径>","<路径>"......]

其中 <路径> 是要挂载的目录路径。该目录路径可以是绝对路径,也可以是相对于容器内文件系统的路径。

比如:

dockerfile 复制代码
VOLUME ["/var/log", "/var/db"]
相关推荐
Linux520小飞鱼12 分钟前
F#语言的网络编程
开发语言·后端·golang
ascarl20103 小时前
k8s系列--通过docker拉取的镜像导入到 containerd中
docker·容器·kubernetes
BinaryBardC4 小时前
Bash语言的数据类型
开发语言·后端·golang
Pandaconda4 小时前
【Golang 面试题】每日 3 题(二十一)
开发语言·笔记·后端·面试·职场和发展·golang·go
_院长大人_5 小时前
使用 Spring Boot 实现钉钉消息发送消息
spring boot·后端·钉钉
northeastsqure5 小时前
docker 基本使用
docker
土豆凌凌七6 小时前
GO随想:GO的并发等待
开发语言·后端·golang
AI向前看6 小时前
C语言的数据结构
开发语言·后端·golang
PyAIGCMaster6 小时前
docker学习记录:本地部署mongodb
学习·mongodb·docker
SomeB1oody6 小时前
【Rust自学】10.8. 生命周期 Pt.4:方法定义中的生命周期标注与静态生命周期
开发语言·后端·rust