Dockerfile构建容器镜像
Dockerfile 是一种文本格式的配置文件,用于自动化构建 Docker 镜像。它包含了一系列指令(命令),每个指令定义了容器镜像构建过程中的一步操作。通过Dockerfile,我们可以指定基础镜像、安装依赖、配置环境变量、复制文件等操作,最终构建出符合需求的镜像。
下面是一个基于Java应用的Dockerfile示例
Dockerfile
# 使用 Java 11 官方镜像作为基础镜像
FROM openjdk:11-jdk
# 设置维护者信息
LABEL maintainer="shiyi@mahai.com"
# 环境变量,可以设置默认的环境变量用于应用配置
ENV SPRING_PROFILES_ACTIVE=prod
ENV JAVA_OPTS="-Xmx512m -Xms256m"
# 设置容器内的工作目录
WORKDIR /app
#将 jar 包复制到工作目录
COPY target/my-spring-boot-app.jar my-app.jar
# 指定对外暴露的端口号
EXPOSE 8080
# 使用 ENTRYPOINT 和 CMD 以提供默认执行命令,同时允许覆盖参数
ENTRYPOINT ["java","-jar","my-app.jar"]
CMD [--server.port=8080"]
Dockerfile 的常用指令
一个 Dockerfile 主要由以下几类指令组成:
1. FROM:指定基础镜像
FROM 是 Dockerfile 中的第一个指令,指定构建镜像所使用的基础镜像。每个 Dockerfile 必须以 FROM 开头。例如:
FROM openjdk:11-jdk
这表示基于openjdk:11-jdk镜像构建新的镜像。
2. WORKDIR:设置工作目录
WORKDIR 设置容器内的工作目录,后续的所有指令(如 RUN、CMD、ENTRYPOINT)都会在这个目录下执行。如果目录不存在,会自动创建。
WORKDIR /app
3. RUN:执行命令
RUN 指令用来执行容器内部的命令,通常用于安装软件包、更新操作系统等。例如:
RUN yum update && yum install -y vim
4. COPY 和 ADD:复制文件和目录
COPY:将本地文件或目录复制到镜像中的指定位置。 ADD:功能类似于 COPY,但还支持从 URL 下载文件并自动解压归档文件。
COPY target/my-spring-boot-app.jar my-app.jar
5. CMD 和 ENTRYPOINT:指定容器启动命令
CMD:指定容器启动时执行的默认命令。如果运行容器时提供了其他命令,则会覆盖 CMD 指令。 ENTRYPOINT:指定容器的启动命令,并且无法被 docker run 中提供的命令覆盖。
ENTRYPOINT ["java","-jar","my-app.jar"]
CMD [--server.port=8080"]
6. EXPOSE:暴露端口
EXPOSE 用来声明容器内部的端口,方便外界访问。EXPOSE 不会映射端口,它只是给用户一个提示,告诉他们容器的端口是开放的。
EXPOSE 8080
7. ENV:设置环境变量
通过 ENV 指令,可以在镜像内设置环境变量,常用于配置应用程序的运行参数。
ENV SPRING_PROFILES_ACTIVE=prod
ENV JAVA_OPTS="-Xmx512m -Xms256m"
8. VOLUME:创建挂载点
VOLUME 用于创建一个持久化的数据存储挂载点,常用于数据库容器等需要持久化存储数据的应用。
VOLUME ["/data"]
如何优化 Dockerfile?
编写 Dockerfile 时,如何提高构建效率和镜像体积是一个值得注意的问题。以下是几个常见的优化技巧:
1. 最小化镜像体积
-
选择合适的基础镜像:
例如,使用 alpine 作为基础镜像(一个非常小的镜像),可以显著减少镜像的体积。
FROM node:14-alpine
-
减少不必要的安装步骤:
避免在 Dockerfile 中安装无关的工具和库,确保镜像中只包含运行所需的最小环境。
2. 使用多阶段构建
多阶段构建可以帮助分离构建过程和最终运行环境,减少最终镜像的体积。你可以在构建阶段安装开发依赖,而在最终阶段只保留生产环境所需的文件。
# 第一阶段:构建应用
FROM node:14 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build# 第二阶段:创建轻量级的生产环境镜像
FROM node:14-alpine
WORKDIR /app
COPY --from=builder /app/dist /app
CMD ["node", "app.js"]
3. 减少镜像层数
每个 Dockerfile 指令(如 RUN、COPY、ADD)都会创建一个镜像层。尽量合并多个命令,以减少镜像层数。例如,将多个 RUN 指令合并为一个:
RUN yum update && \yum install -y vim && \yum clean
常见的 Dockerfile 示例
1. Node.js 应用的 Dockerfile
# 使用官方 Node.js 镜像
FROM node:14
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制应用程序代码
COPY . .
# 暴露应用运行端口
EXPOSE 3000
# 启动应用
CMD ["node", "app.js"]
2. Python 应用的 Dockerfile
# 使用官方 Python 镜像
FROM python:3.9
# 设置工作目录
WORKDIR /app
# 复制 requirements.txt
COPY requirements.txt .
# 安装 Python 依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 设置环境变量
ENV PYTHONUNBUFFERED 1
# 暴露应用端口
EXPOSE 5000
# 启动应用
CMD ["python", "app.py"]
3. Java 应用的 Dockerfile
# 选择基础镜像,使用 OpenJDK 17(你也可以选择其他版本)
FROM openjdk:17-jdk-alpine
# 设置工作目录
WORKDIR /app
# 将本地构建的 JAR 文件复制到容器内
COPY target/my-app.jar /app/my-app.jar
# 暴露容器的端口(Spring Boot 默认端口是 8080)
EXPOSE 8080
# 指定容器启动时的命令,运行 Spring Boot 应用
ENTRYPOINT ["java", "-jar", "/app/my-app.jar"]
总结
Dockerfile 是构建 Docker 镜像的核心工具,它不仅简化了镜像构建的过程,也为容器的可移植性和一致性提供了保证。在编写 Dockerfile 时,我们要考虑镜像体积、构建速度、层的优化等问题,确保最终生成的镜像符合生产环境的需求。
相关文章:
Dockerfile构建容器镜像
Dockerfile 是一种文本格式的配置文件,用于自动化构建 Docker 镜像。它包含了一系列指令(命令),每个指令定义了容器镜像构建过程中的一步操作。通过Dockerfile,我们可以指定基础镜像、安装依赖、配置环境变量、复制文件…...
python 在包含类似字符\x16、\x12、\x某某的数组中将以\x开头的字符找出来的方法
话不多说直接看例子: import re# 原始列表 data [\x16, \x17, s, \x16, hello, \x1A]# 正则表达式匹配以 \x 开头的字符串 pattern r^\\x# 找出以 \x 开头的字符 result [item for item in data if isinstance(item, str) and re.match(pattern, repr(item)[1:-…...
Spring Bean 的生命周期介绍
Spring Bean 的生命周期涉及多个阶段,从实例化到销毁,在开发中我们可以通过各种接口和注解介入这些阶段来定制化自己的功能。以下是详细的生命周期流程: 1. Bean 的实例化(Instantiation) 方式:通过构造函…...
调用腾讯云批量文本翻译API翻译srt字幕
上一篇文章介绍了调用百度翻译API翻译日文srt字幕的方法。百度翻译API是get方式调用,参数都放在ur中,每次调用翻译文本长度除了接口限制外,还有url长度限制,而日文字符通过ur转码后会占9个字符长度,其实从这个角度来讲…...
车载软件架构 --- 软件定义汽车面向服务架构的应用迁移
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…...
Baklib引领内容中台与人工智能技术的创新融合之路
内容概要 在数字化转型的浪潮中,各行业正在面临前所未有的挑战与机遇。内容中台作为一种新的概念,逐渐进入了企业的视野,它不仅是一个技术平台,更是提供了整合和管理内容的新思路。从根本上,内容中台旨在提升企业对信…...
想品客老师的第十一天:模块化开发
模块化概念 模块化开发可以提高代码的可维护性、可读性和复用性,同时降低开发和调试的复杂性,把业务根据功能分开写,解决变量命名的冲突,可以开放部分接口给类(例如调用模块里的一个函数)也更适合团队协作…...
接入DeepSeek大模型
接入DeepSeek 下载并安装Ollamachatbox 软件配置大模型 下载并安装Ollama 下载并安装Ollama, 使用参数ollama -v查看是否安装成功。 输入命令ollama list, 可以看到已经存在4个目录了。 输入命令ollama pull deepseek-r1:1.5b, 下载deepse…...
基于遗传算法的256QAM星座图的最优概率整形matlab仿真,对比优化前后整形星座图和误码率
目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): GA优化曲线: 优化前后星座图对比 优化前后误码率对比 仿真操作步骤…...
JavaScript系列(57)--工程化实践详解
JavaScript工程化实践详解 🏗️ 今天,让我们深入探讨JavaScript的工程化实践。良好的工程化实践对于构建可维护、高质量的JavaScript项目至关重要。 工程化基础概念 🌟 💡 小知识:JavaScript工程化是指在JavaScript开…...
Linux-CentOS的yum源
1、什么是yum yum是CentOS的软件仓库管理工具。 2、yum的仓库 2.1、yum的远程仓库源 2.1.1、国内仓库 国内较知名的网络源(aliyun源,163源,sohu源,知名大学开源镜像等) 阿里源:https://opsx.alibaba.com/mirror 网易源:http://mirrors.1…...
【大数据技术】案例03:用户行为日志分析(python+hadoop+mapreduce+yarn+hive)
用户行为日志分析(python+hadoop+mapreduce+yarn+hive) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 本机PyCharm远程连接虚拟机Python 搭建完全分布式高可用大数据集群(MySQL+Hive)...
LeetCode 0680.验证回文串 II:两侧向中间,不同就试删
【LetMeFly】680.验证回文串 II:两侧向中间,不同就试删 力扣题目链接:https://leetcode.cn/problems/valid-palindrome-ii/ 给你一个字符串 s,最多 可以从中删除一个字符。 请你判断 s 是否能成为回文字符串:如果能…...
第二十章 存储函数
目录 一、概述 二、语法 三、示例 一、概述 前面章节中,我们详细讲解了MySQL中的存储过程,掌握了存储过程之后,学习存储函数则肥仓简单,存储函数其实是一种特殊的存储过程,也就是有返回值的存储过程。存储函数的参数…...
架构规划之任务边界划分过程中承接分配
架构师在边界划分的过程中需要做什么事情呢?接下来,我们会讨论一些关于任务分配的 基础假设,以及由这些基础假设而带来的决策路径。 所谓任务边界划分,就是判定某个任务在多个承接方中,应该归属到哪个承接方的过程。…...
【C++】线程池实现
目录 一、线程池简介线程池的核心组件实现步骤 二、C11实现线程池源码 三、线程池源码解析1. 成员变量2. 构造函数2.1 线程初始化2.2 工作线程逻辑 3. 任务提交(enqueue方法)3.1 方法签名3.2 任务封装3.3 任务入队 4. 析构函数4.1 停机控制 5. 关键技术点解析5.1 完美转发实现5…...
vsnprintf的概念和使用案例
vsnprintf 是 C/C 标准库中用于格式化字符串的安全函数,属于 <stdio.h>(C)或 <cstdio>(C)头文件。它是 snprintf 的可变参数版本(v 表示 va_list),允许通过 va_list 处理…...
解读隐私保护工具 Fluidkey:如何畅游链上世界而不暴露地址?
作者:Techub 独家解读 撰文:Tia,Techub News 隐私不只是个人权利的象征,更是我们迈向透明、信任未来的重要过渡桥梁。如果你还未意识到隐私的重要性,推荐阅读 KeyMapDAO 的文章《「被出卖的自由」:我到底该…...
Linux环境Kanass安装配置简明教程
Kanass是一款国产开源免费的项目管理软件,本文将介绍如何快速在linux centos环境下安装配置,以快速上手。 1. 安装 以下以linux centos7下安装为例。 下载,下载地址:Kanass - 下载,下载Linux安装包如tiklab-kanass-1.0.4.rpm&am…...
数据分析常用的AI工具
数据分析领域中常用的AI工具种类繁多,涵盖了从数据处理、分析到可视化和预测的各个环节。以下是一些常见且广泛应用的AI数据分析工具及其特点: 1. 数据处理与清洗工具 Python库:如PandasAI,集成了生成式AI能力,支持自…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
