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能力,支持自…...
英特尔将雷电3集成进CPU:如何重塑高速接口生态与USB4标准
1. 项目概述:Thunderbolt 3的十字路口与英特尔的关键抉择如果你在2017年前后关注过PC和笔记本的接口演进,一定会对那个混乱的时期记忆犹新。一边是USB 3.0/3.1 Gen 1/Gen 2各种命名让人眼花缭乱,另一边是性能强悍但曲高和寡的Thunderbolt&…...
CREO 6.0装配实战:别再乱拖零件了,手把手教你用‘移动’和‘角度偏移’精准定位
CREO 6.0装配实战:从零件乱飞到精准定位的进阶技巧 刚接触CREO装配模块的新手设计师,最常遇到的挫败感莫过于:明明在脑海中构思好了零件位置,实际操作时却总是出现零件"乱飞"、"定位不准"的情况。这种体验就像…...
NeuroSynth脑成像元分析:Python神经影像数据处理终极指南
NeuroSynth脑成像元分析:Python神经影像数据处理终极指南 【免费下载链接】neurosynth Neurosynth core tools 项目地址: https://gitcode.com/gh_mirrors/ne/neurosynth NeuroSynth是一个功能强大的Python包,专门用于大规模功能性神经影像数据的…...
FPGA LVDS输入作为模拟比较器的原理、设计与工程实践
1. 项目概述:当LVDS输入遇上模拟电压 最近几年,各大FPGA厂商都在力推自家的“模拟-数字转换器(ADC)IP核”,宣传其如何集成便利、性能优越。这让我这个老工程师不禁琢磨,这些IP核的底层原理究竟是什么&#…...
3分钟解锁百度网盘极速下载:BaiduPCS-Web高效解决方案全攻略
3分钟解锁百度网盘极速下载:BaiduPCS-Web高效解决方案全攻略 【免费下载链接】baidupcs-web 项目地址: https://gitcode.com/gh_mirrors/ba/baidupcs-web 还在为百度网盘的龟速下载而烦恼吗?今天我要为你介绍一个能够彻底改变下载体验的神器——…...
ComfyUI-Impact-Pack深度解析:从AI图像模糊到专业级细节增强的完整解决方案
ComfyUI-Impact-Pack深度解析:从AI图像模糊到专业级细节增强的完整解决方案 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. …...
图像理解的底层逻辑:从像素到语义的三层跃迁
1. 这不是“看图说话”,而是让机器学会“看见”的底层逻辑 你有没有想过,当手机相册自动给你把“猫”和“狗”的照片分到不同相册里,或者修图App能一键抠出人像边缘、连发丝都清晰分明,背后到底发生了什么?很多人以为A…...
三步实现iOS虚拟定位:无需越狱的终极免费方案
三步实现iOS虚拟定位:无需越狱的终极免费方案 【免费下载链接】iFakeLocation Simulate locations on iOS devices on Windows, Mac and Ubuntu. 项目地址: https://gitcode.com/gh_mirrors/if/iFakeLocation iFakeLocation是一个专业级的iOS虚拟定位工具&am…...
FreeRTOS CPU使用率统计的坑:为什么你的数据跑了1小时就不准了?
FreeRTOS CPU使用率统计的陷阱与高精度优化方案 当你在嵌入式系统中集成FreeRTOS的CPU使用率统计功能时,可能会遇到一个令人困惑的现象:系统运行约1小时后,统计数值突然出现明显偏差。这不是你的代码出了问题,而是隐藏在32位变量和…...
nimbus-router:声明式路由增强框架,解决SPA复杂路由管理痛点
1. 项目概述:一个为现代前端应用量身定制的路由解决方案 如果你和我一样,在过去几年里深度参与过大型前端项目的开发,那你一定对路由管理这个“甜蜜的负担”深有体会。一方面,像 React Router、Vue Router 这样的库已经非常成熟&a…...
