Dockerfile 文件详解

server/2025/2/9 13:56:40/

        在平常的开发工作中,我们经常需要部署项目,一个项目开发完成后,使用 Docker 方式部署,那么首先得构造镜像,构造镜像最主要的就是 Dockerfile>Dockerfile 文件的编写,今天简单来总结下 Dockerfile>Dockerfile 文件的编写以及有哪些注意事项。

     1:概述

        Dockerfile>Dockerfile 是一种纯文本文件,文件命名就是 “Dockerfile>Dockerfile”,用来构建 Docker 镜像的文本文件,包含了一系列的指令和参数。通过 Dockerfile>Dockerfile 构建的镜像可以保证开发环境、测试环境和生产环境的镜像一致,避免了换机器不能运行的问题。通过指令可以自动构建镜像。Dockerfile>Dockerfile 可以与 Jenkins 等集成,实现自动化构建和部署。

     2:构建步骤

        (1):编写 Dockerfile>Dockerfile 文件,示例如下:

# 示例一
# 使用OpenJDK 17基础镜像
FROM openjdk:17RUN mkdir -p /mall/logs# 切换工作目录
WORKDIR /mall# 配置环境变量
ENV SERVER_PORT=80 \LC_ALL=C.UTF-8# 暴露应用端口
EXPOSE 80# 添加应用Jar包到容器中
ADD mall-admin.jar ./app.jar# 设置容器的启动命令,支持暴露两个端口
ENTRYPOINT ["java", \"-Dserver.port=${SERVER_PORT}", \"-jar", "app.jar"]#示例二
FROM openjdk:17
ENV SERVER_PORT=8080
EXPOSE ${SERVER_PORT}
ADD mall-admin.jar ./app.jar
ENTRYPOINT java -jar app.jar

        (2):docker build  -t  镜像名称:tag .,如:

        docker build -t  mall:1.0 .   1.0为tag版本号,后面的点为以当前目录构建上下文。

     3:Dockerfile>Dockerfile 常用指令

        (1):FROM:指定基础镜像,Dockerfile>Dockerfile 必须以 from 开头,from openjdk后面如果写版本号,则拉取该版本作为基础镜像,如果不写版本号,则会拉拉取标签为 latest 版本作为基础镜像,即,如:

# 指定版本 镜像名称:tag
from openjdk:17# 不指定版本
from openjdk

        (2):RUN:在镜像构建过程中执行命令,如新建文件夹、安装软件等,查看 linux 内核版本命令:cat  /etc/os-release,如:

# 创建目录 -p 如果不存在父级目录,首先会创建父级目录,再创建子目录
RUN mkdir -p /mall/logs# 安装软件
# 安装 Redis
RUN dnf install -y redis && \# 清理 dnf 缓存以减小镜像体积dnf clean all

        (3):WORKDIR:设置工作目录,为后续的RUN、COPY、ADD等指令设定工作目录

# 切换工作目录
WORKDIR /mall

        (4):ENV:设置环境变量,设置端口为80,LANG=C.UTF-8 指定系统的默认语言和字符编码,是一个特殊的环境变量,它的优先级高于其他所有与语言环境相关的环境变量(如 LANG 等)。当设置了LC_ALL后,它会覆盖其他语言环境变量的设置,整个系统都使用LC_ALL设置的语言环境,如:

# 配置环境变量
ENV SERVER_PORT=80 \LANG=C.UTF-8 \LC_ALL=C.UTF-8

        (5):EXPOSE容器运行时监听的网络端口,如:

# 暴露一个端口
EXPOSE 80#暴露两个端口
EXPOSE 9001 9002

        (6):ADD:添加 jar 包到 Docker 镜像中,如:将构建上下文中的 mall-admin.jar 文件复制到镜像的 /app 目录并命名为 app.jar。

        ADD:将文件复制到镜像中。

        mall-admin.jar:主机上的源文件(通常位于 Dockerfile>Dockerfile 所在的目录或指定路径)。

        ./app.jar:目标路径,表示将文件复制到镜像中的当前工作目录,并重命名为 app.jar。

# 复制源文件到镜像中并重命名
ADD mall-admin.jar ./app.jar

        (7):CMD/ENTRYPOINT:指定容器启动时执行的命令。CMD:命令可以被覆盖,ENTRYPOINT:只能传递参数,命令不能被覆盖,如:

# 1. 两种参数都存在
# 容器启动时,默认会执行 ENTRYPOINT 和 CMD的命令。
# 如果运行 docker run image,实际执行的命令是 ENTRYPOINT 和 CMD 的命令。
# 如果运行 docker run image test-cmd,实际执行的命令是 ENTRYPOINT的指令 和 test-cmd(CMD 被覆盖)。
# 固定容器的启动命令,推荐使用 ENTRYPOINT
# exec 格式,推荐使用 exec 格式,即类似于json格式
ENTRYPOINT ["java", \"-Dserver.port=${SERVER_PORT}", \"-jar", "app.jar"]# 定义容器启动时的默认参数,可以被 docker run 传递的参数覆盖
CMD ["java", \"-Dserver.port=${SERVER_PORT}", \"-jar", "app.jar"]# 2. 只有 ENTRYPOINT 
# 容器启动时,必须指定参数
# 如果运行 docker run image test-cmd,实际执行的命令是 ENTRYPOINT的指令 和 test-cmd。
ENTRYPOINT ["java", \"-Dserver.port=${SERVER_PORT}", \"-jar", "app.jar"]# 3. 只有 CMD
# 容器启动时,默认执行 CMD 的指令
# 如果运行 docker run image test-cmd,实际执行的命令是 test-cmd(CMD 被覆盖)。
CMD ["java", \"-Dserver.port=${SERVER_PORT}", \"-jar", "app.jar"]

     4:构建镜像

        使用 docker build -t  mall:1.0 .,构建完成后,使用 docker images 查看镜像:

        

        以上为 Dockerfile>Dockerfile 文件的基本内容,主要是设置基础镜像、设置工作目录、设置启动命令等。编写完成后可以使用 docker build -t 测试文件是否正确,如果 Dockerfile>Dockerfile 文件有问题,则构建镜像失败。如果构建成功,则可以用 docker images 命令查看镜像。


http://www.ppmy.cn/server/166231.html

相关文章

Flutter完整开发实战详解(六、 深入Widget原理)

Flutter 番外的世界系列文章专栏 首先我们需要明白,Widget 是什么?这里有一个 “总所周知” 的答就是:Widget并不真正的渲染对象 。是的,事实上在 Flutter 中渲染是经历了从 Widget 到 Element 再到 RenderObject 的过程。 我们都…

链表专题-03

链表专题(三) 两数相加 问题 [力扣2] 2. 两数相加 - 力扣(LeetCode) 问题描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加&#xff…

[渗透测试]热门搜索引擎推荐— — shodan篇

[渗透测试]热门搜索引擎推荐— — shodan篇 免责声明:本文仅用于分享渗透测试工具,大家使用时,一定需要遵守相关法律法规。 除了shodan,还有很多其他热门的,比如:fofa、奇安信的鹰图、钟馗之眼等&#xff0…

DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”_deepseek ddos

当算力博弈升级为网络战争:拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下,网络已然成为人类社会运转的关键基础设施,深刻融入经济、生活、政务等各个领域。从金融交易的实时清算&#xf…

23个经典情绪风格干净邋遢电影边框LR调色预设 Archipelago - Borders Toolset

此套装展示了一系列经过精心策划的边框预设,这些预设是从不同 Archipelago 和 Quest 集中的先前版本中精心挑选的。该工具集具有 23 个边框,包含三种不同的风格 – 干净、电影和邋遢 – 该工具集提供了多种选项,以补充任何艺术愿景。 &#…

火热的大模型: AIGC架构解析

文章目录 一、背景介绍二、架构描述数据层模型层(MaaS)服务层(PaaS)基础设施层(IaaS)应用层 三、架构分析四、应用场景与价值4.1 典型场景4.2 价值体现 五、总结 一、背景介绍 火热的大模型,每…

0207作业

思维导图 服务器 enum Type{TYPE_REGIST,TYPE_LOGIN };typedef struct Pack{int size;enum Type type;char buf[2048];}pack_t;typedef struct list{union Data{struct List* tail;char str[64];}data;struct List* next;struct List* prev; }List;List* create_node(){List* …

openAI官方prompt技巧(二)

1. 赋予 ChatGPT 角色 为 ChatGPT 指定一个角色,让其从特定的身份或视角回答问题。这有助于生成针对特定受众或场景的定制化回答。 例如: 你是一名数据分析师,负责我们的市场营销团队。请总结上个季度的营销活动表现,并强调与未…