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,一经查实,立即删除!

相关文章

Git提交错误解决:missing Change-Id in message footer

问题现象: 提交的commit中没有插入change id导致push代码失败。 问题解决: 针对该错误,Git已经给出了解决方案: 1、to automatically insert a Change-Id, install the hook: gitdir$(git rev-parse --git-dir); scp -p -P 2…

第四十一章:沪上逐梦:适应新环境的挑战

2022 年底,凛冽的寒风裹挟着岁末的清冷,毫无保留地席卷了整个华夏大地。上海,这座屹立在东方的繁华都市,在这冰寒彻骨的冬日里,愈发显得冷峻而深沉。小冷怀揣着对新工作的满心期待,以及对未来的无限憧憬&am…

多租户架构设计与实现:基于 PostgreSQL 和 Node.js

多租户架构设计与实现:基于 PostgreSQL 和 Node.js 引言 多租户架构(Multi-tenancy)是现代 SaaS(Software as a Service)应用的核心设计模式之一。它允许多个租户共享同一套应用实例,同时确保数据隔离和安全性。本文将详细介绍多租户架构的设计方案,并基于 PostgreSQL…

顺丰java面试题_顺丰java开发面试分享,顺丰java面试经面试题

今天要给大家分享的是一个小伙伴的顺丰java开发面试过程,其中包括了面试流程,面试题目,和回答,感兴趣的朋友可以来了解一下哈。 一、面试流程 是中午进行的面试,首先是做自我介绍,之后就是讲一下项目&…

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

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

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

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

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

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

rBits.exe服务备份

Program.cs using System; using System.Collections.Generic; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading.Tasks;namespace rBits {internal static class Program{/// <summary>/// 应用程序的主入口点。/// </s…

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

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

互联网分布式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领域驱动与微服务架构设计设计模…

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

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

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

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

vue基础(三)

常用指令 1. v-bind 固定绑定与动态绑定&#xff1a; 语法&#xff1a; 标准语法&#xff1a;v-bind:属性"动态数据" 简写语法&#xff1a;:属性"动态数拓" <!DOCTYPE html> <html lang"en"><head><me…

IDEA中Resolving Maven dependencies卡着不动解决方案

一、修改settings.xml Maven配置阿里云仓库主要通过修改Maven的settings.xml文件来实现‌。以下是具体步骤: ‌1、找到settings.xml文件‌: 通常位于Maven安装目录下的conf文件夹中,或者在用户目录下的.m2文件夹中(如果用户自定义了settings.xml的位置)。 2、‌编辑se…

fastchat 部署大模型

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

【R语言】卡方检验

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

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

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

从结构体成员指针反推结构体地址:rt_container_of 宏解析

文章目录 rt_container_of 宏概述步骤1&#xff1a;计算成员偏移量步骤2&#xff1a;将成员指针转换为字节指针步骤3&#xff1a;计算结构体的地址步骤4&#xff1a;返回结构体指针 代码示例宏的内部实现解析 rt_container_of 宏概述 rt_container_of 宏是一个非常实用的宏定义…

dijkstra算法类型题解

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

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

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