以下是常用的 Dockerfile 指令和它们的功能:
1. FROM
定义镜像的基础镜像。每个 Dockerfile 都应该以 FROM
开头,指定使用哪个基础镜像构建当前镜像。
FROM ubuntu:20.04
2. RUN
在镜像构建过程中执行命令,如安装软件包、更新系统等。每个 RUN
指令都会创建一个新的镜像层。
RUN apt-get update && apt-get install -y python3
3. CMD
指定容器启动时默认执行的命令。通常,CMD
用于启动应用程序。一个 Dockerfile 只能有一个 CMD
,如果有多个 CMD
,最后一个 CMD
会生效。
CMD ["python3", "app.py"]
4. ENTRYPOINT
定义容器启动时始终执行的命令,通常与 CMD
结合使用。ENTRYPOINT
会始终执行,但 CMD
中的内容会作为默认参数传递给 ENTRYPOINT
。
ENTRYPOINT ["python3"]
CMD ["app.py"]
5. ENV
设置环境变量,容器在运行时可以访问这些变量。你可以通过 ENV
来定义多个环境变量。
ENV APP_ENV=production
ENV DB_HOST=db.local
6. COPY
将文件从主机复制到容器内指定的路径。与 ADD
相比,COPY
更为简单和明确,通常用于复制本地文件到镜像中。
COPY ./myapp /app
7. ADD
除了复制文件外,ADD
还可以解压 .tar
文件和从 URL 下载文件。虽然 COPY
更推荐用于复制本地文件,但 ADD
对某些情况(如从 URL 下载文件)更为方便。
ADD ./source.tar.gz /app
8. EXPOSE
声明容器需要监听的端口。EXPOSE
本身不会发布端口,但它告诉 Docker 用户和其他开发者容器将使用哪些端口。
EXPOSE 8080
9. VOLUME
创建一个挂载点,允许数据从宿主机或其他容器挂载到容器内的指定路径。常用于持久化数据。
VOLUME ["/data"]
10. WORKDIR
设置工作目录,所有后续的命令(如 RUN
、CMD
等)都会在该目录中执行。如果目录不存在,WORKDIR
会创建它。
WORKDIR /app
11. USER
指定容器内运行命令的用户。默认情况下,容器以 root 用户运行,可以通过 USER
指定其他用户。
USER appuser
12. ARG
定义构建时的变量,ARG
的值在构建时提供,可以用作参数传递给 RUN
命令等。
ARG APP_VERSION=1.0
RUN echo "App version: $APP_VERSION"
13. LABEL
给镜像添加元数据,例如版本、作者、描述等。LABEL
可以使用键值对来存储信息。
LABEL version="1.0" author="developer"
14. SHELL
更改容器中默认的 shell,默认情况下是 /bin/sh -c
,可以将其更改为其他 shell,如 bash
。
SHELL ["/bin/bash", "-c"]
15. STOPSIGNAL
设置容器停止时发送的信号。默认情况下,Docker 会发送 SIGTERM
信号来停止容器,但你可以通过 STOPSIGNAL
指定其他信号(例如 SIGINT
)。
STOPSIGNAL SIGTERM
16. HEALTHCHECK
定义容器的健康检查命令,Docker 会定期执行该命令来检查容器是否健康。你可以定义检查的时间间隔、重试次数等。
HEALTHCHECK --interval=30s --retries=3 CMD curl --fail http://localhost/health || exit 1
17. ONBUILD
指定当作为基础镜像时,执行的指令。它常用于定义父镜像中的某些构建步骤,在子镜像中自动执行。ONBUILD
指令通常用于构建可复用的基础镜像。
ONBUILD RUN echo "This will run when this image is used as a base."
18. COPY --from
(多阶段构建)
用于多阶段构建中,从另一个构建阶段复制文件。多阶段构建可以帮助减少最终镜像的大小。
FROM golang:1.16 AS builder
WORKDIR /src
COPY . .
RUN go build -o myapp .
FROM alpine:3.12
COPY --from=builder /src/myapp /usr/local/bin/
总结
除了 FROM
、RUN
、CMD
、ENV
之外,Dockerfile 还有很多其他有用的指令,帮助你在构建镜像时更好地配置环境、管理文件和优化性能。以下是这些指令的总结:
- 定义镜像环境:
FROM
、ENV
、LABEL
、WORKDIR
- 运行命令:
RUN
、CMD
、ENTRYPOINT
- 文件操作:
COPY
、ADD
、VOLUME
- 容器管理:
EXPOSE
、USER
、STOPSIGNAL
- 构建优化:
ARG
、HEALTHCHECK
、ONBUILD
- 多阶段构建:
COPY --from
这些指令可以帮助你创建更灵活、可维护且高效的 Docker 镜像。
暂无评论内容