在 Dockerfile 中,有多个常用指令和参数可以用来定义如何构建 Docker 镜像。以下是一些最常用的 Dockerfile 指令及其参数介绍:
1. FROM
:指定基础镜像
- 功能:定义构建镜像所用的基础镜像。
- 语法:
FROM <image>[:<tag>]
- 示例:
FROM ubuntu:20.04
2. RUN
:执行命令并创建镜像层
- 功能:在构建镜像过程中执行命令,通常用于安装软件包、更新系统等。
- 语法:
RUN <command>
- 示例:
RUN apt-get update && apt-get install -y nginx
3. CMD
:定义容器启动时默认执行的命令
- 功能:指定容器启动时执行的命令及其默认参数。如果
docker run
中指定了其他命令,CMD
的命令会被覆盖。 - 语法:
CMD ["executable", "param1", "param2"] CMD ["param1", "param2"] CMD command param1 param2
- 示例:
CMD ["nginx", "-g", "daemon off;"]
4. ENTRYPOINT
:定义容器启动时必须执行的命令
- 功能:指定容器启动时必须执行的命令,并且不能被
docker run
中的参数覆盖。常用于设定容器的主命令。 - 语法:
ENTRYPOINT ["executable", "param1", "param2"]
- 示例:
ENTRYPOINT ["nginx"]
注意
: RUN CMD ENTRYPOINT
三个指令容易混淆, 可以参考Dockerfile-RUN/CMD/ENTRYPOINT的区别
5. COPY
:将文件或目录从宿主机复制到镜像中
- 功能:将文件或目录从构建上下文中复制到镜像内的指定路径。
- 语法:
COPY <src> <dest>
- 示例:
COPY index.html /usr/share/nginx/html/
6. ADD
:将文件、目录或远程文件添加到镜像中
- 功能:类似于
COPY
,但支持从 URL 下载文件以及解压归档文件。 - 语法:
ADD <src> <dest>
- 示例:
ADD https://example.com/file.tar.gz /app/
7. WORKDIR
:设置工作目录
- 功能:指定接下来所有命令的工作目录。如果目录不存在,会自动创建。
- 语法:
WORKDIR /path/to/directory
- 示例:
WORKDIR /app
8. ENV
:设置环境变量
- 功能:定义环境变量,容器在运行时可以访问这些变量。
- 语法:
ENV <key>=<value>
- 示例:
ENV APP_ENV=production
9. EXPOSE
:声明容器监听的端口
- 功能:指示容器在运行时监听的端口,这个信息仅用于文档化,并不会实际开放端口。
- 语法:
EXPOSE <port> [<port>/protocol...]
- 示例:
EXPOSE 80
- 补充 : 若要实际开放端口, 则需要在运行容器时使用
docker run
命令的-p
选项来映射端口, 例如docker run -d -p 8080:80 my-image
; 或者使用-P
将容器内所有的 EXPOSE 端口随机映射到宿主机上的可用端口, 例如docker run -d -P my-image
。
10. VOLUME
:创建挂载点
- 功能:创建一个容器内挂载点,用于持久化数据或共享数据。
- 语法:
VOLUME ["/data"]
- 示例:
VOLUME ["/app/data"]
- 补充: 如果没有在
docker run
使用-v 宿主机挂载位置:容器内挂载位置
, 则为匿名挂载
, docker 会自动管理这个卷的挂载, 这个匿名卷通常会存储在 /var/lib/docker/volumes/ 下。
11. USER
:指定用户
- 功能:设置容器内运行命令的用户。
- 语法:
USER <username>[:<group>]
- 示例:
USER appuser
12. ARG
:定义构建时变量
- 功能:定义在镜像构建时使用的变量,构建时可以通过
--build-arg
传递值。 - 语法:
ARG <name>[=<default_value>]
- 示例:
ARG VERSION=1.0 RUN echo "Version is $VERSION"
13. ONBUILD
:定义触发构建时的指令
- 功能:在你构建的这个镜像作为基础镜像时触发。
- 语法:
ONBUILD <instruction>
- 示例:
ONBUILD RUN echo "This runs on build of the derived image"