Dockerfile 文件详解

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

     1:概述

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

     2:构建步骤

        (1):编写 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 常用指令

        (1):FROM:指定基础镜像,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 所在的目录或指定路径)。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天津三石峰科技——汽车生产厂的设备振动检测项目案例

汽车产线有很多传动设备需要长期在线运行,会出现老化、疲劳、磨损等 问题,为了避免意外停机造成损失,需要加装一些健康监测设备,监测设备运 行状态。天津三石峰科技采用 12 通道振动信号采集卡(下图 1)对…

SpringBoot教程(十四) SpringBoot之集成Redis

SpringBoot教程(十四) | SpringBoot之集成Redis 一、Redis集成简介二、集成步骤 2.1 添加依赖2.2 添加配置2.3 项目中使用之简单使用 (举例讲解)2.4 项目中使用之工具类封装 (正式用这个)2.5 序列化 &…

多智能体协作架构模式:驱动传统公司向AI智能公司转型

前言 在数字化浪潮的席卷下,传统公司的运营模式正面临着前所未有的挑战。随着市场竞争的日益激烈,客户需求的快速变化以及业务复杂度的不断攀升,传统公司在缺乏 AI 技术支撑的情况下,暴露出诸多痛点。在决策层面,由于…

边缘计算网关驱动智慧煤矿智能升级——实时预警、低延时决策与数字孪生护航矿山安全高效运营

迈向智能化煤矿管理新时代 工业物联网和边缘计算技术的迅猛发展,煤矿安全生产与高效运营正迎来全新变革。传统煤矿监控模式由于现场环境复杂、数据采集和传输延时较高,已难以满足当下高标准的安全管理要求。为此,借助边缘计算网关的实时数据…

互联网分布式ID解决方案

业界实现方案 1. 基于UUID 2. 基于DB数据库多种模式(自增主键、segment) 3. 基于Redis 4. 基于ZK、ETCD 5. 基于SnowFlake 6. 美团Leaf(DB-Segment、zkSnowFlake) 7. 百度uid-generator() 基于UUID生成唯一ID UUID生成策略 推荐阅读 DDD领域驱动与微服务架构设计设计模…

深入理解小波变换:信号处理的强大工具

引言 在科学与工程领域,信号处理一直是关键环节,傅里叶变换与小波变换作为重要的分析工具,在其中发挥着重要作用。本文将深入探讨小波变换,阐述其原理、优势以及与傅里叶变换的对比,并通过具体案例展示其应用价值。 一…

【数据结构】(7) 栈和队列

一、栈 Stack 1、什么是栈 栈是一种特殊的线性表,它只能在固定的一端(栈顶)进行出栈、压栈操作,具有后进先出的特点。 2、栈概念的例题 答案为 C,以C为例进行讲解: 第一个出栈的是3,那么 1、…

fastchat 部署大模型

大模型实战--Llama3.1大模型部署及启动Web UI、OpenAI API实操 - 简书一、背景 随着人工智能技术的飞速发展,大模型(Large Language Models, LLMs)已成为自然语言处理领域的核心工具。这些模型以其强大的语言理解和生成能力,...ht…

【R语言】卡方检验

一、定义 卡方检验是用来检验样本观测次数与理论或总体次数之间差异性的推断性统计方法,其原理是比较观测值与理论值之间的差异。两者之间的差异越小,检验的结果越不容易达到显著水平;反之,检验结果越可能达到显著水平。 二、用…

【deepSeek R1】Ollama 更改模型安装位置 以及应用安装位置

【deepSeek R1】Ollama 更改模型安装位置 以及应用安装位置 本地版部署deepSeek R1 可以参考文章 3分钟教你搭建属于自己的本地大模型 DeepSeek R1 Ollama 是一个开源工具,旨在帮助用户轻松在本地计算机上运行、部署和管理大型语言模型(LLMs)…

dijkstra算法类型题解

dijkstra算法(有权图,无权图): 带权路径长度——当图是带权图时,一条路径上所有边的权值之和,称为该路径的带权路径长度 初始化三个数组,final标记各顶点是否已找到最短路径,dist最…

6.Centos7上部署flask+SQLAlchemy+python+达梦数据库

情况说明 前面已经介绍了window上使用pycharm工具开发项目时,window版的python连接达梦数据库需要的第三方包。 这篇文章讲述,centos7上的python版本连接达梦数据库需要的第三方包。 之前是在windows上安装达梦数据库的客户端,将驱动包安装到windows版本的python中。(开…

国产化创新 守护开放边界网络安全

当今数字化浪潮的席卷下,企业、医院、政府部门等各类机构的信息化建设正以前所未有的速度推进。 在这个数字化转型的关键时期,尤其是在涉及国家核心利益和敏感数据的领域,我们不仅要追求技术的先进性,更要确保安全性和自主可控性…

postgresql 游标(cursor)的使用

概述 PostgreSQL游标可以封装查询并对其中每一行记录进行单独处理。当我们想对大量结果集进行分批处理时可以使用游标,因为一次性处理可能造成内存溢出。 另外我们可以定义函数返回游标类型变量,这是函数返回大数据集的有效方式,函数调用者…

Linux 快速对比两个文件的差异值

Linux 快速对比两个文件的差异值(无需排序、直接输出) 在日常开发或数据处理中,若需快速对比两个文本文件中的差异值(仅保留第一个文件中的独有内容),Linux 系统提供了两种高效方法。以下是具体操作及适用…

语言月赛 202308【小粉兔做麻辣兔头】题解(AC)

》》》点我查看「视频」详解》》》 [语言月赛 202308] 小粉兔做麻辣兔头 题目描述 粉兔喜欢吃麻辣兔头,麻辣兔头的辣度分为若干级,用数字表示,数字越大,兔头越辣。为了庆祝粉兔专题赛 #1 的顺利举行,粉兔要做一些麻…

C++20导出模块及使用

1.模块声明 .ixx文件为导入模块文件 math_operations.ixx export module math_operations;//模块导出 //导出命名空间 export namespace math_ {//导出命名空间中函数int add(int a, int b);int sub(int a, int b);int mul(int a, int b);int div(int a, int b); } .cppm文件…

使用redis实现 令牌桶算法 漏桶算法

流量控制算法,用于限制请求的速率。 可以应对缓存雪崩 令牌桶算法 核心思想是: 有一个固定容量的桶,里面存放着令牌(token)。每过一定时间(如 1 秒),桶中会自动增加一定数量的令牌…

活动预告 | 解锁 Excel 新境界 —— AI 技术赋能下的数据分析超级引擎!

课程介绍 在 AI 技术的浪潮中,Microsoft Excel 已经焕然一新,它不再仅仅是海量复杂数据的处理中心,更是未来趋势的预测大师。智能 Copilot 副驾驶的加入,让 Excel 如虎添翼,成为每一位数据探索者梦寐以求的超级引擎。在…

在阿里云ECS上一键部署DeepSeek-R1

DeepSeek-R1 是一款开源模型,也提供了 API(接口)调用方式。据 DeepSeek介绍,DeepSeek-R1 后训练阶段大规模使用了强化学习技术,在只有极少标注数据的情况下提升了模型推理能力,该模型性能对标 OpenAl o1 正式版。DeepSeek-R1 推出…