文章目录
- Dockerfile镜像文件
-
- 一、什么是dockerfile
- 二、dockerfile基本结构
- [三、Dockerfile 常用指令](#三、Dockerfile 常用指令)
- 容易混淆的指令
Dockerfile镜像文件
一、什么是dockerfile
之前我们拉取镜像的时候,都是在仓库拉取的
我们也介绍了怎么上传镜像
那么问题来了:
如果我想把自己的 Go 程序、运行环境以及相关配置打包成一个 Docker 镜像,应该怎么做?
一种方式是:
- 先启动一个基础容器
- 进入容器,安装需要的软件
- 把自己的程序复制进去
- 配置启动命令
- 再把容器提交为一个镜像
但这种方式有一个问题:每次构建镜像都需要手动重复这些操作
有没有办法把这些操作提前写下来,让 Docker 自动执行?
这就是 Dockerfile 要解决的问题
Dockerfile 是一个文本文件,我们可以在其中编写一系列指令,描述镜像应该如何构建
Docker 根据这些指令自动完成镜像构建
比如:我们现在有一个Go项目,希望把它打包成一个Docker镜像
你可以在项目中编写 Dockerfile,告诉 Docker:
- 使用什么基础镜像
- 将项目文件复制到哪里
- 执行什么命令
- 容器启动时运行什么程序
最后 Docker 就会根据这些指令构建出镜像
二、dockerfile基本结构
那我们用什么语句编写dockerfile文件呢
下面我们来介绍dockerfile的基本结构
Dockerfile 由一条条指令组成
每条指令通常采用这样的形式:
指令 参数
例如:
FROM nginx
WORKDIR /app
COPY index.html /app/
我们先认识这三条指令
1) FROM 指定基础镜像
FROM nginx
表示以 nginx 镜像作为基础镜像,在它的基础上继续构建。
2) WORKDIR 设置工作目录(属于容器里面的目录)
WORKDIR /app
表示将后续指令的工作目录设置为 /app
如果目录不存在,Docker 会自动创建。
3)COPY 复制文件
COPY index.html /app/
表示将构建上下文中的 index.html 复制到镜像的 /app/ 目录下(/app是工作目录)
Dockerfile是如何构建的呢
Docker 在构建时,会按照指令顺序执行:
- 以 nginx 作为基础镜像
- 在镜像中设置
/app工作目录 - 将
index.html复制到/app
最终得到一个新的镜像
这里还要联系之前学过的镜像分层原理:
Dockerfile 中的部分构建指令会产生新的镜像层
例如,FROM 引入基础镜像,COPY、RUN 等指令在构建过程中可以产生新的层。并不是每一条 Dockerfile 指令都会产生一个独立镜像层
三、Dockerfile 常用指令
| 指令 | 作用 | 使用方法 |
|---|---|---|
FROM |
指定基础镜像 | FROM ubuntu:22.04 |
RUN |
构建镜像时执行命令 | RUN apt-get update |
COPY |
复制文件到镜像 | COPY app.jar /app/ |
ADD |
复制文件,支持本地 tar 自动解压 | ADD app.tar.gz /app/ |
WORKDIR |
设置工作目录 | WORKDIR /app |
ENV |
设置环境变量 | ENV APP_PORT=8080 |
ARG |
定义构建参数 | ARG VERSION=1.0 |
CMD |
设置容器默认启动命令 | CMD ["nginx", "-g", "daemon off;"] |
ENTRYPOINT |
设置容器入口程序 | ENTRYPOINT ["nginx"] |
EXPOSE |
声明容器监听端口 | EXPOSE 8080 |
LABEL |
添加镜像元数据 | LABEL version="1.0" |
USER |
指定运行用户 | USER nginx |
VOLUME |
声明数据卷挂载点 | VOLUME ["/data"] |
HEALTHCHECK |
设置容器健康检查 | `HEALTHCHECK CMD curl -f http://localhost/ |
SHELL |
指定默认 Shell | SHELL ["/bin/bash", "-c"] |
STOPSIGNAL |
设置容器停止信号 | STOPSIGNAL SIGTERM |
ONBUILD |
设置下游构建触发指令 | ONBUILD COPY . /app |
容易混淆的指令
| 指令 | 执行时机 / 区别 |
|---|---|
| RUN | 镜像构建阶段执行 |
| CMD | 容器启动时执行,可被运行时命令替换 |
| ENTRYPOINT | 指定容器入口程序,运行时参数通常追加到入口程序后 |
| COPY | 复制文件 |
| ADD | 复制文件,还支持本地 tar 自动解压 |
| ARG | 构建阶段参数 |
| ENV | 镜像运行环境中的环境变量 |
| EXPOSE | 声明端口,不会自动映射宿主机端口 |
完结撒花~
