📅  最后修改于: 2023-12-03 15:21:46.105000             🧑  作者: Mango
Dockerfile 是用于构建 Docker 镜像的文本文件,它包含了构建、运行和管理 Docker 镜像所需的指令和描述信息。Dockerfile 中的每个指令都表示一个镜像层,可以被 Docker 引擎逐层构建。
Dockerfile 的基本语法非常简单,每个指令都以关键字 FROM
、RUN
、COPY
等开头,例如:
# 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 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
指令都可以用于向镜像中复制文件。它们的语法非常相似,如下所示:
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
指令用于定义容器启动时执行的命令。例如:
CMD ["python", "app.py"]
这条指令的意思是,在容器启动时执行命令 python app.py
。
ENTRYPOINT
指令也是用于定义容器启动时执行的命令,但它是不可被覆盖的。例如:
ENTRYPOINT ["python"]
CMD ["app.py"]
这条指令的意思是,将 Python 解释器作为容器启动时执行的命令,而 CMD 指令则指定了要运行的 Python 脚本文件。
EXPOSE
指令用于向 Docker 容器内部声明要监听的端口号,让 Docker 知道在创建容器时需要运行哪些端口。例如:
EXPOSE 80/tcp
这条指令的意思是,声明容器内将监听 80 端口,并使用 TCP 协议。
WORKDIR
指令用于设置容器内部的工作目录。例如:
WORKDIR /myapp
这条指令的意思是,将容器内部的工作目录设置为 /myapp。
USER
指令用于指定运行容器的用户。例如:
USER www
这条指令的意思是,将容器运行的用户设置为 www。
ENV
指令用于设置环境变量。例如:
ENV MYVAR=value
这条指令的意思是,在容器内设置环境变量 MYVAR 的值为 value。
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 文档进行深入研究。