什么是 Dockerfile?
Dockerfile 是 Docker 用于构建镜像的文本配置文件,定义了镜像的构建步骤和环境配置,包含了构建 Docker 镜像的所有指令。
使用 Dockerfile 定制镜像
下面定制一个 nginx 镜像为例,构建好的镜像内会有一个/usr/share/nginx/html/index.html 的文件。
创建 Dockerfile
在一个空目录下,新建一个名为 Dockerfile 的文件,并在文件内添加 以下 内容。
[root@lavm-5wutyiasaf gps]# vim Dockerfile
[root@lavm-5wutyiasaf gps]# cat Dockerfile
From nginx
RUN echo "这是一个本地构建的nginx镜像" > /usr/share/nginx/html/index.html
基本命令说明:
FROM
:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制所需要的基础原始镜像。RUN
:用于执行后面跟着的命令行命令。
注:
Dockerfile 的指令每执行一次都会在 Docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
例如,下面的写法会创建 3 层镜像:
[root@lavm-5wutyiasaf gps]# cat Dockerfle
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
构建镜像
在 Dockerfile 文件存放目录下,执行构建动作:
[root@lavm-5wutyiasaf gps]# ls
1.txt Dockerfile
[root@lavm-5wutyiasaf gps]# docker build -f Dockerfile -t nginx:1 .
参数说明:
-f
:指定文件名。Dockerfile 必须以大写 D 开头命名为Dockerfile
,除非使用-f 参数指定其他文件名。-t
:参数用于 指定镜像名称和标签。.
:最后的点表示构建上下文路径。
注意:
上下文路径不要放无用的文件,因为 会一起打包发送给 Docker 引擎,如果文件过多会造成 构建过程缓慢。
Dockerfile 指令详解
指令 | 说明 | 示例 | 关键细节 |
---|---|---|---|
FROM | 指定基础镜像,用于后续的指令构 | FROM ubuntu:22.04 | 必须为第一条指令(ARG 除外) |
MAINTAINER | 指定 Dockerfile 的作者/维护者(已弃用,推荐使用 LABEL) | MAINTAINER gps | 作用与 LABEL 指令类似,用于镜像添加作者、维护者、联系方式等元数据;仅限于指定维护者信息。 |
LABEL | 添加镜像的元数据,使用键值对的形式 | LABEL version="1.0" | 比 MAINTAINER 更有广泛的用途,可以用来 添加更多类型的元数据信息, |
RUN | 在构建过程中在镜像中执行命令 | RUN apt-get update && apt-get install -y nginx | 合并命令可减少层数 |
CMD | 指定容器创建时的默认命令(可以被覆盖) | Shell 格式:CMD python app.py Exec 格式: CMD ["python","app.py"] | 一个 Dockerfile 里 只能包含一个 CMD 指令,如果有多个,只有最后一个 CMD 指令会 生效。 |
ENTRYPOINT | 设置容器创建时的主要命令(不可被覆盖) | ENTRYPOINT ["echo","hello"] | 该指令会在容器启动时始终执行,无论是否指定了其他命令,都不会被覆盖,而是作为容器的主要执行命令 。 |
EXPOSE | 声明容器运行时监听的特定网络端口 | EXPOSE 80 | |
ENV | 在容器内部设置环境变量 | ENV MY_NAME gps ENV APP_HOME /app | 容器启动时环境变量是 ENV 指定的值,运行时可通过 docker run 明的-e 选项还覆盖环境变量的值。 |
ADD | 将文件、目录或远程URL复制到镜像中 | ADD app.py /app/ ADD src/ /app/ ADD https://example.com/file.tar.gz /tmp/ ADD app.tar.gz /app/ | 它类似于COPY指令,但在功能上更强大,除了复制文件和目录 ,该指令还 支持 自动解压缩。 |
COPY | 将文件或目录复制到镜像中 | COPY app.py /app/ COPY src/ /app/ | 它不支持自动解压缩功能,与ADD指令相比,功能更简单明确。 |
VOLUME | 为容器创建挂载点或声明卷 | 单个目录:VOLUME ["/data"] 多个目录: VOLUME ["/data","/var/log"] | |
WORKDIR | 设置后续指令的工作目录 | WORKDIR /app | |
USER | 指定后续指令的用户上下文 | USER myuser | 容器运行时,进程将以 myuser 用户的身份运行,而不是以 root 用户身份。 |
ARG | 定义构建过程中的变量 | ARG MY_ENV=production ENV ENVIRONMENT=$MY_ENV | |
ONBUILD | 当镜像被用作另一个构建过程的基础时,添加触发器 |
666
xxx