dockerfile是一种用于定义和构建docker镜像的文本文件,由一行行指令和参数组成,用于描述镜像的构建和配置过程;由基础映像、软件包安装、文件拷贝、环境变量设置等组成;
基于dockerfile构建镜像可以使用docker build命令,使用 -f 可以指定具体的dockerfile文件;
使用dockerfile构建镜像的步骤如下:编写dockerfile文件-->docker build构建镜像-->docker run运行镜像;
dockerfile概述
dockerfile文件需放置在一个目录中,这个目录中有构建镜像的所有文件,是本次执行的上下文路目录(可以理解为docker根目录),可以创建子目录。
在dockerfile文件中,"#“号开头表示注释,每行为"instruction arguments”,习惯大写表示关键字(但并不区分大小写),后面小写表示值。
每个dockerfile的第一行(注释行除外),必须使用"from"关键字。
当使用docker build构建镜像时,会将我们指定的上下文目录打包传递给docker引擎。这个上下文目录中并非所有文件都会在dockerfile中使用,传送给docker引擎的目录过大会影响构建速度,可以在此目录中定义.dockerignore文件,将不使用的文件的文件名写入到.dockerignore文件屏蔽掉,且支持通配符。
最小化镜像的层数,dockerfile中每一行命令就是一层,层数过多影响构建效率。
dockerfile文件中命令从上往下逐行执行。
dockerfile镜像的指令和参数
dockerfile 是一个文本文件,它包含了用于构建 docker 镜像的一系列指令和参数。以下是 dockerfile 的常见结构和组成部分:
指令 | 说明 |
---|---|
from | 指定基础镜像,开始构建新镜像 |
run | 执行命令并创建新的镜像层 |
cmd | 提供容器启动时执行的默认命令 |
entrypoint | 设置容器启动时的入口点 |
copy | 从构建上下文复制新文件或目录到镜像中 |
add | 类似于 copy,但可以解压缩归档文件并添加执行权限 |
env | 设置环境变量 |
arg | 定义构建时使用的变量 |
volume | 定义一个挂载点,用于数据持久化或共享 |
expose | 声明容器运行时监听的端口 |
workdir | 设置工作目录 |
user | 指定运行命令的用户 |
healthcheck | 定义容器的健康检查命令 |
onbuild | 指定当所创建的镜像作为其他镜像的基础镜像时执行的命令 |
stopsignal | 配置停止容器的信号 |
label | 为镜像添加元数据 |
shell | 指定用于执行 run、cmd、entrypoint 和 script 指令的 shell |
maintainer | 指定维护者的姓名和一个可选的电子邮件地址(已废弃) |
dockerfile镜像案例
# 使用基础镜像,这是构建新镜像的起点 from ubuntu:20.04 as base # 维护者信息(使用 label 替代 maintainer) label maintainer="name <email>" # 设置环境变量,这会影响后续的run指令以及容器运行时的环境 env my_env_var="my_value" env path="/usr/local/bin:${path}" # run 指令执行命令并创建一个新的镜像层,用于安装软件包 run apt-get update && apt-get install -y \ curl \ git \ vim # 工作目录 :workdir 设置工作目录,后续的run、cmd、entrypoint指令都会基于这个工作目录 workdir /app # 复制当前目录内容到容器内的 /app 目录下,copy 从构建上下文(通常为dockerfile所在的目录)复制新文件或目录到镜像中 copy . /app # 添加额外的文件到镜像中:add 与copy类似,但可以处理tar压缩文件,并且可以执行一些特殊操作 add ./files/* /app/files/ # 定义一个挂载点:volume 定义一个挂载点,用于数据持久化或容器间数据共享 volume /var/log/myapp # expose 声明容器运行时监听的端口 expose 8000 # 指定容器启动时执行的命令:cmd 指令提供容器启动时执行的默认命令,可以被docker run的参数覆盖 cmd ["python", "/app/main.py"] # 构建阶段:编译应用,使用多阶段构建来减小最终镜像的大小 from base as builder run apt-get update && apt-get install -y build-essential copy --from=base /app /app run make /app # 生产阶段:运行应用,使用基础镜像作为构建产物的运行环境 from base as production copy --from=builder /app/bin /app/bin cmd ["/app/bin/myapp"] # 健康检查: healthcheck 定义容器的健康检查命令,提高容器的可靠性 healthcheck --interval=30s --timeout=30s --retries=3 \ cmd curl -f http://localhost:8000 || exit 1 # 用户:user 指定运行命令的用户和用户组,提高安全性 user 1000:1000 # 构建缓存:arg 定义构建缓存的变量,可以用于构建过程中的参数传递 arg build_date label org.label-schema.build-date=$build_date # 停止信号:stopsignal 配置停止容器的信号,可以是任何posix停止信号或数字 stopsignal sigterm # 使用 shell 指令 :shell 指定用于执行指令的shell,可以是bash、sh等 shell ["/bin/bash", "-c"]
解释
基础镜像: 使用 ubuntu:20.04
作为基础镜像。
维护者信息: 使用 label
替代已废弃的 maintainer
。
环境变量: 设置环境变量 my_env_var
和更新 path
。
更新和安装软件: 使用 run
安装软件包。
工作目录: 设置工作目录为 /app
。
复制文件: 使用 copy
和 add
将文件添加到镜像中。
挂载点: 定义一个挂载点。
暴露端口: 声明容器运行时监听的端口。
默认命令: 设置容器启动时执行的默认命令。
构建阶段: 使用 builder
阶段编译应用。
生产阶段: 使用 production
阶段运行应用。
健康检查: 定义容器的健康检查命令。
用户: 指定运行命令的用户。
构建缓存: 使用 arg
定义构建时的变量。
停止信号: 配置停止容器的信号。
shell: 指定用于执行指令的 shell。
命令详细说明
基础镜像指令 (from
)
from ubuntu:20.04
from
指令指定了基础镜像,这是构建新镜像的基础。
维护者指令 (maintainer
) (可选,已废弃,建议使用 label)
label maintainer="name <email>"
label
用于添加元数据,替代了以前的 maintainer
指令。
环境变量指令 (env
)
env path /usr/local/bin:$path
env
用于设置环境变量。
工作目录指令 (workdir
)
workdir /app
workdir
设置容器内的当前工作目录。
复制指令 (copy
和 add
)
copy . /app
copy
从构建上下文复制新文件或目录到容器的文件系统。
add
与 copy
类似,但处理归档文件时有额外的功能。
运行指令 (run
)
run apt-get update && apt-get install -y nginx
run
指令用于执行命令,并将其结果(如安装的软件)作为新的镜像层保存。
暴露指令 (expose
)
expose 80
expose
指令通知 docker 守护进程容器运行时监听的端口。
启动命令指令 (cmd
)
cmd ["nginx", "-g", "daemon off;"]
cmd
指令指定了容器启动时执行的默认命令。
健康检查指令 (healthcheck
)
healthcheck --interval=30s --timeout=30s --retries=3 cmd curl -f http://localhost || exit 1
healthcheck
指令用于指定如何检查容器健康状况。
构建缓存指令 (arg
)
arg version=latest
arg
指令用于定义构建过程中的变量。
多阶段构建 (from
在 dockerfile 中多次使用)
# 第一阶段: 构建阶段 from golang:1.16 as builder workdir /app copy go.* ./ run go mod download copy . . run go build -o /my-go-app # 第二阶段: 生产环境 from alpine:latest run apk add --no-cache ca-certificates workdir /root copy --from=builder /my-go-app . cmd ["./my-go-app"]
使用多阶段构建可以减小最终镜像的大小,将构建产物从构建阶段复制到生产环境镜像。
dockerfile实战案例1:spring boot应用
项目结构
假设我们的spring boot应用结构如下:
springbootapp/ ├── src/ │ ├── main/ │ │ ├── java/com/ │ │ │ └── example/ │ │ │ ├── controller/ │ │ │ │ └── hellocontroller.java │ │ │ └── application.java │ │ └── resources/ │ │ └── application.properties ├── pom.xml └── dockerfile
hellocontroller.java
是spring boot控制器。
application.java
是spring boot应用的主程序。
application.properties
包含应用配置。
pom.xml
是maven构建配置文件。
dockerfile
# 使用官方java基础镜像,带有maven环境,用于构建项目 from maven:3.8.1-jdk-11 as build # 设置工作目录 workdir /app # 复制项目文件到容器中 copy src ./src copy pom.xml . # 使用maven构建项目 run mvn -f pom.xml clean package # 使用官方java基础镜像,用于运行应用 from openjdk:11-jre-slim # 设置工作目录 workdir /app # 从构建阶段复制已构建的jar文件到运行阶段 copy --from=build /app/target/*.jar ./app.jar # 暴露端口 expose 8080 # 运行spring boot应用 cmd ["java", "-jar", "app.jar"]
构建和运行docker镜像
构建镜像:
docker build -t springbootapp .
运行容器:
docker run -p 8080:8080 springbootapp
dockerfile实战案例2:spring boot和mybatis多模块项目
项目结构
多模块spring boot和mybatis应用结构如下:
multimoduleapp/ ├── pom.xml ├── dockerfile └── app/ ├── common/ │ ├── pom.xml │ └── src/ │ ├── main/ │ └── java/ │ └── com/ │ └── example/ │ └── common/ │ └── commonservice.java ├── api/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── api/ │ │ │ └── apicontroller.java │ │ └── resources/ │ └── application.properties └── service/ ├── pom.xml ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── service/ │ │ │ └── businessservice.java │ │ └── resources/ └── src/ └── main/ └── resources/ └── mapper/ └── usermapper.xml
commonservice.java
是一个通用服务。
apicontroller.java
是spring boot控制器。
businessservice.java
是业务逻辑服务。
usermapper.xml
是mybatis映射文件。
pom.xml
是maven构建配置文件。
dockerfile
# 使用官方java基础镜像,带有maven环境,用于构建项目 from maven:3.8.1-jdk-11 as build # 设置工作目录 workdir /app # 复制项目文件到容器中 copy . . # 使用maven构建项目 run mvn -f pom.xml clean package # 使用官方java基础镜像,用于运行应用 from openjdk:11-jre-slim # 设置工作目录 workdir /app # 从构建阶段复制已构建的jar文件到运行阶段 copy --from=build /app/api/target/*.jar ./app.jar # 暴露端口 expose 8080 # 运行spring boot应用 cmd ["java", "-jar", "app.jar"]
构建和运行docker镜像
构建镜像:
docker build -t multimoduleapp .
运行容器:
docker run -p 8080:8080 multimoduleapp
总结
到此这篇关于docker利用dockerfile构建镜像的文章就介绍到这了,更多相关dockerfile构建docker镜像内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论