背景
- Dockerfile 是一个文本文件,其中包含了一系列的指令和参数,用于组装镜像。
- Dockerfile 支持多种指令,以下是主要的 Dockerfile 指令及其解释!
FROM
- 指定基础镜像。
AS <name>
是可选的,用于给基础镜像设置一个别名,以便在后续的COPY
或FROM
指令中引用。
dockerfile
# FROM <image> [AS <name>]
FROM node as node
RUN
在镜像构建过程中执行命令
dockerfile
# RUN <command>
RUN ls /opt/web
RUN echo "*** hello world ***"
RUN apk add --no-cache nodejs=20.15.1-r0
RUN apk add --no-cache npm
WORKDIR
设置工作目录,对后续的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令生效。
dockerfile
WORKDIR /path/to/workdir
COPY
- 将构建上下文中的文件或目录复制到镜像中。
- 可选:
--from
用于从另一个阶段或镜像中复制文件。
dockerfile
FROM node as node
# COPY <源路径> <目标路径>
COPY --from=node /opt/web/dist/ /dist/
COPY ./deploy/nginx.conf /etc/nginx/conf.d/default.conf
ADD
ADD
指令用于将文件、目录或远程 URL 的内容添加到镜像中。它还可以自动解压压缩文件(如
.tar
、.tar.gz
、.tgz
、.bzip2
、.xz
等)。然而,需要注意的是,
ADD
指令主要用于添加本地文件到镜像中,并且如果添加的是压缩文件,它会自动解压。如果仅仅是为了复制文件,通常推荐使用
COPY
指令,因为它更加直观且性能更好。
dockerfile
# 将本地文件 myfile.txt 添加到镜像的 /app/ 目录下
ADD myfile.txt /app/
# 或者,从远程 URL 下载一个压缩包并解压到镜像的 /app/ 目录下:
ADD https://example.com/myapp.tar.gz /app/
CMD
- CMD 指令用于指定容器启动时运行的默认命令。
- 如果有多个 CMD 指令,只有最后一个会生效。
- CMD 可以包含参数,这些参数可以在运行
docker run
命令时被覆盖。
CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT
- 配置容器启动时运行的命令。
- 与 CMD 不同,ENTRYPOINT 指定的命令不会被 docker run 命令行参数覆盖,而是将这些参数传递给 ENTRYPOINT 指定的命令。
dockerfile
ENTRYPOINT sh /bin/modify.sh
/bin/modify.sh
bash
#!/bin/bash
node -v
# nginx 重启
/usr/sbin/nginx -s reload
nginx -g 'daemon off;'
CMD 与 ENTRYPOINT 的区别
- CMD 主要用于定义容器启动时的默认命令,并允许通过
docker run
命令的参数来覆盖;- 而 ENTRYPOINT 则用于定义容器的主执行程序,并确保该程序始终被执行。
EXPOSE
- 声明容器运行时监听的端口,但并不会实际发布端口。
- 要与
-p
或--publish
标志一起使用 docker run 命令来发布端口。
dockerfile
# 暴露 8081 端口
EXPOSE 8081
ENV
设置环境变量。
dockerfile
# ENV <key1>=<value1> <key2>=<value2> ...
ENV NODE_VERSION 14.17.0
# 可以设置多个环境变量
ENV RAILS_ENV=production \
SECRET_KEY=your-secret-key
LABEL
为镜像添加元数据标签。
dockerfile
# LABEL <key>=<value> <key>=<value> ...
# 可以增加多个元数据标签
LABEL maintainer="<name> <email>" \
description="This is a description of the image" \
version="1.0"