📜  什么是 Dockerfile 语法?(1)

📅  最后修改于: 2023-12-03 15:21:46.105000             🧑  作者: Mango

Dockerfile 语法

Dockerfile 是用于构建 Docker 镜像的文本文件,它包含了构建、运行和管理 Docker 镜像所需的指令和描述信息。Dockerfile 中的每个指令都表示一个镜像层,可以被 Docker 引擎逐层构建。

基本语法

Dockerfile 的基本语法非常简单,每个指令都以关键字 FROMRUNCOPY 等开头,例如:

# Dockerfile 中的注释以 # 开头
FROM ubuntu:18.04
RUN apt update \
    && apt install -y python3 python3-pip \
    && pip3 install requests
COPY app.py /app/
CMD ["python3", "/app/app.py"]

以上是一个简单的 Dockerfile,包含了以下指令:

  • FROM:指定基础镜像,在本例中是 Ubuntu 18.04。
  • RUN:执行命令,在本例中是更新 apt 仓库并安装 Python 和 requests 库。
  • COPY:复制文件,将本地的 app.py 文件复制到容器内的 /app/ 目录。
  • CMD:定义容器启动时执行的命令,本例中是运行 Python 应用程序。
第一条指令

在 Dockerfile 中,第一条指令必须是 FROM 指令,表示基础镜像的选择。例如:

FROM ubuntu:18.04

这条指令的意思是,基础镜像使用 Ubuntu 18.04 版本。

RUN 指令

RUN 指令用于执行命令,并创建一个新的镜像层。例如:

RUN apt-get update && apt-get install -y python3 python3-dev python3-pip

这条指令的意思是,更新 apt 仓库并安装 Python3 相关的软件包。

RUN 指令也可以多行,例如:

RUN apt-get update \
    && apt-get install -y python3 python3-dev python3-pip

这样更易于阅读和维护 Dockerfile。

COPY 和 ADD 指令

COPYADD 指令都可以用于向镜像中复制文件。它们的语法非常相似,如下所示:

  • COPY <src> <dest>
  • ADD <src> <dest>

其中 <src> 表示源文件或目录,可以是本地文件系统的绝对路径,也可以是 Dockerfile 所在目录下的相对路径;<dest> 表示目标路径,必须是容器内的绝对路径。

COPY 指令只能复制本地文件系统中的文件,而 ADD 指令还支持 URL 形式的文件。例如:

COPY index.html /var/www/html/
ADD http://nginx.org/index.html /var/www/html/

这条指令的意思是,将本地文件 index.html 复制到容器内的 /var/www/html/ 目录,并从 URL http://nginx.org/index.html 中下载文件到容器内的 /var/www/html/ 目录。

CMD 和 ENTRYPOINT 指令

CMD 指令用于定义容器启动时执行的命令。例如:

CMD ["python", "app.py"]

这条指令的意思是,在容器启动时执行命令 python app.py

ENTRYPOINT 指令也是用于定义容器启动时执行的命令,但它是不可被覆盖的。例如:

ENTRYPOINT ["python"]
CMD ["app.py"]

这条指令的意思是,将 Python 解释器作为容器启动时执行的命令,而 CMD 指令则指定了要运行的 Python 脚本文件。

EXPOSE 指令

EXPOSE 指令用于向 Docker 容器内部声明要监听的端口号,让 Docker 知道在创建容器时需要运行哪些端口。例如:

EXPOSE 80/tcp

这条指令的意思是,声明容器内将监听 80 端口,并使用 TCP 协议。

WORKDIR 指令

WORKDIR 指令用于设置容器内部的工作目录。例如:

WORKDIR /myapp

这条指令的意思是,将容器内部的工作目录设置为 /myapp。

USER 指令

USER 指令用于指定运行容器的用户。例如:

USER www

这条指令的意思是,将容器运行的用户设置为 www。

ENV 指令

ENV 指令用于设置环境变量。例如:

ENV MYVAR=value

这条指令的意思是,在容器内设置环境变量 MYVAR 的值为 value。

ARG 指令

ARG 指令用于定义构建时的参数。例如:

ARG VERSION
FROM ubuntu:${VERSION}

这条指令的意思是,定义了一个名为 VERSION 的构建参数,在构建镜像时通过 --build-arg 选项进行传递。

指令继承方式

Dockerfile 中有两种指令继承方式:

  • ONBUILD 指令:表示这条指令将在镜像被子镜像继承时才会执行;
  • FROM 指令:表示继承自该指令的子镜像会从新的基础镜像开始构建。

例如:

FROM ubuntu:18.04
RUN apt-get update && apt-get install -y python3
ONBUILD ADD . /app
ONBUILD WORKDIR /app
ONBUILD CMD ["python3", "-m", "http.server", "80"]

这条指令的意思是,先从 Ubuntu 18.04 构建基础镜像,在该镜像被继承时,使用 ADD 指令将当前目录下的文件复制到容器内的 /app 目录,然后使用 WORKDIR 指令将工作目录设置为 /app,最后执行 CMD 指令启动一个简单的 HTTP 服务器。

总结

以上是 Dockerfile 的基本语法和常用指令介绍,由于 Dockerfile 具有非常丰富的语法,因此我们建议开发者可以参考 Docker 文档进行深入研究。