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.rhkb.cn/news/14684.html

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

相关文章

开源模型应用落地-CodeQwen模型小试-SQL专家测试(二)

一、前言 代码专家模型是基于人工智能的先进技术,它能够自动分析和理解大量的代码库,并从中学习常见的编码模式和最佳实践。这种模型可以提供准确而高效的代码建议,帮助开发人员在编写代码时避免常见的错误和陷阱。 通过学习代码专家模型&a…

kubeadm构建k8s源码阅读环境

目标 前面看了minikube的源码了解到其本质是调用了kubeadm来启动k8s集群,并没有达到最初看代码的目的。 所以继续看看kubeadm的代码,看看能否用来方便地构建源码调试环境。 k8s源码编译 kubeadm源码在k8s源码库中,所以要先克隆k8s源码。之…

LLM学习笔记1——本地部署Meta-Llama-3.2-1B大模型

系列文章目录 参考博客 参考博客 文章目录 系列文章目录前言与调用一、部署要求二、实现步骤0.深度学习环境错误1,验证pytorch版本时提示以下问题:错误2,验证pytorch版本时提示以下问题:错误3,有时候还会提示你有一些…

搜维尔科技:提供人形机器人传感器的应用案例分析

视觉传感器 • 家庭服务场景:在家庭清洁机器人中,视觉传感器可以识别家具、障碍物的位置和形状,规划清洁路径,避开桌椅、宠物玩具等。如小米扫地机器人,通过视觉传感器与算法结合,能构建房间地图&#xff…

windows蓝牙驱动开发-蓝牙 LE 邻近感应配置文件

邻近感应检测是蓝牙低功耗 (LE) 的常见用途。 本部分提供了创建可用于开发 UWP 设备应用的邻近感应配置文件的设备实现的指南。 在开发此应用之前,应熟悉蓝牙 LE 函数和蓝牙 LE 邻近感应配置文件规范。 示例服务声明 蓝牙低功耗引入了一个新的物理层,…

逻辑回归:Sigmoid函数在分类问题中的应用

欢迎来到我的主页:【Echo-Nie】 本篇文章收录于专栏【机器学习】 1 什么是Sigmoid函数? Sigmoid函数(Logistic函数)是机器学习中最经典的激活函数之一,是一个在生物学中常见的S型函数,也称为S型生长曲线。…

如何在Windows中配置MySQL?

MySQL是一个广泛使用的开源关系型数据库管理系统,它支持多种操作系统平台,其中包括Windows。无论是开发者进行本地开发,还是管理员为应用程序配置数据库,MySQL都是一个非常流行的选择。本篇文章将详细介绍如何在Windows操作系统中…

MySQL的操作

一.数据库的操作 1.创建数据库 create database (if not exists) 数据库名称 (character set/charset 字符集名称); SQL中有特定含义的单词(create database)也就是关键字 在创建数据库名 表名 列名的时候都可以和关键字重复 。 if not exists&#xff1…

MariaDB *MaxScale*实现mysql8读写分离

1.MaxScale 是干什么的? MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换,对多个从服务器能实现负载均衡。 2.MaxScale 实验环境 中间件192.168.12…

响应式编程_05 Project Reactor 框架

文章目录 概述响应式流的主流实现框架RxJavaReactor Project Reactor 框架Reactor 异步数据序列Flux 和 Mono 组件FluxMono 操作符背压处理 小结 概述 响应式编程_02基本概念:背压机制 Backpressure介绍了响应式流规范以及 Spring 框架中的响应式编程技术&#xff…

免费windows pdf编辑工具Epdf

Epdf(完全免费) 作者:不染心 时间:2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器,目前仍在开发中。它提供了一系列实用的命令行选项,方便用户对 PDF …

计算机组成原理(3)

计算机组成原理(3) 存储器层次结构存储器概述存储器分类存储器性能指标 半导体随机存储SRAM和DRAM 存储器层次结构 主存-辅存:实现了虚拟存储系统,解决了主存容量不足的问题; Cache-主存:解决了主存于CPU速…

html 列动态布局

样式说明: /* 列动态布局,列之间以空格填充 */ li {display: flex;/* flex-direction: column; */justify-content: space-between; }

25/2/8 <机器人基础> 阻抗控制

1. 什么是阻抗控制? 阻抗控制旨在通过调节机器人与环境的相互作用,控制其动态行为。阻抗可以理解为一个力和位移之间的关系,涉及力、速度和位置的协同控制。 2. 阻抗控制的基本概念 力控制:根据感测的外力调节机械手的动作。位置…

Redis03 - 高可用

Redis高可用 文章目录 Redis高可用一:主从复制 & 读写分离1:主从复制的作用2:主从复制原理2.1:全量复制2.2:增量复制(环形缓冲区) 3:主从复制实际演示3.1:基本流程准…

蓝桥杯C语言组:图论问题

蓝桥杯C语言组图论问题研究 摘要 图论是计算机科学中的一个重要分支,在蓝桥杯C语言组竞赛中,图论问题频繁出现,对参赛选手的算法设计和编程能力提出了较高要求。本文系统地介绍了图论的基本概念、常见算法及其在蓝桥杯C语言组中的应用&#…

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

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

Ollama + AnythingLLM + Deepseek r1 实现本地知识库

1、Ollama:‌是一个开源的大型语言模型 (LLM)服务工具,旨在简化在本地运行大语言模型的过程,降低使用大语言模型的门槛‌。 2、AnythingLLM:是由Mintplex Labs Inc. 开发的一款全栈应用程序,旨在构建一个高效、可定制、…

(Arxiv-2023)HiPA: 通过高频增强自适应实现一步文本到图像扩散模型

HiPA: 通过高频增强自适应实现一步文本到图像扩散模型 paper是NUS发布在Arxiv 2023的工作 paper title:HiPA: Enabling One-Step Text-to-Image Diffusion Models via High-Frequency-Promoting Adaptation Code:等待开源 Abstract 扩散模型已彻底改变了文本到图像…

Java版本与JDK版本

两者关联 Java版本指的Java语言和平台的版本,例如Java8、Java11、Java17等,每个版本会引入新特性、改进和修复。 JDK(Java Development Kit)版本则是开发工具包,包含编译器、调试器等工具,通常与Java版本对应,例如JDK…