【docker】使用 Dockerfile 构建镜像
一、什么是Dockerfile
Dockerfile 是用于构建 Docker 镜像的文本文件。它包含了一系列的指令,用于描述如何构建镜像的步骤和配置。
通过编写 Dockerfile,您可以定义镜像的基础环境、安装软件包、复制文件、设置环境变量等操作。Dockerfile 提供了一种可重复、可自动化的方式来构建镜像,使得您可以轻松地创建和部署应用程序的容器化版本。
Dockerfile 的编写非常灵活,您可以根据自己的需求和项目的特点来定义构建镜像的步骤和配置。通过使用 Dockerfile,您可以将整个构建过程以代码的形式进行版本控制,并且可以轻松地在不同的环境中重复构建相同的镜像。
Dockerfile的基本结构包括四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以“#”字符开头则被视为注释。
在Dockerfile中可以使用多种指令,例如RUN、CMD、FROM、EXPOSE、ENV等。这些指令可以用来定义镜像的操作系统、软件安装、环境变量等。
一旦编写好 Dockerfile,您可以使用 Docker 命令来构建镜像。通过运行 docker build 命令并指定 Dockerfile 的路径,Docker 引擎将根据 Dockerfile 中的指令逐步执行构建过程,生成一个新的镜像。
总结来说,Dockerfile 是一个用于定义构建 Docker 镜像的文本文件,它提供了一种可重复、可自动化的方式来构建和配置镜像,使得容器化应用程序的构建和部署更加简单和可靠。
二、Dockerfile 中常用的指令
| 指令 | 说明 |
|---|---|
| FROM | 指定基础镜像 |
| MAINTAINER | 设置维护者信息 |
| RUN | 在镜像中执行命令 |
| CMD | 指定容器启动时要执行的命令 |
| ENTRYPOINT | 与 CMD 类似,但不会被 docker run 命令行参数覆盖 |
| COPY | 复制文件或目录到镜像中 |
| ADD | 复制文件或目录到镜像中,支持远程 URL 和解压缩功能 |
| ENV | 设置环境变量 |
| ARG | 定义构建时的变量,可以通过 --build-arg 参数传递 |
| WORKDIR | 设置工作目录 |
| EXPOSE | 声明容器运行时需要监听的端口 |
| USER | 指定运行容器时的用户名或 UID |
| HEALTHCHECK | 定义容器的健康检查命令 |
| VOLUME | 声明容器中的挂载点 |
| LABEL | 为镜像添加元数据 |
这些指令可以根据需要灵活组合,构建出符合需求的 Docker 镜像。请注意,Dockerfile 中的指令顺序很重要,因为每个指令都会创建一个新的镜像层,而后续的指令将基于前面的镜像层进行操作。
更详细的指令说明和用法,请参考 Docker 官方文档:https://docs.docker.com/engine/reference/builder/
三、Dockerfile 使用示例
1、以nginx为例,通过Dockerfile构建镜像
以下是一个简单的 Dockerfile 示例,以构建一个基于 Nginx 的镜像:
# 使用基础镜像
FROM nginx:latest# 复制自定义配置文件到镜像中
COPY nginx.conf /etc/nginx/nginx.conf# 复制静态文件到镜像中
COPY static /usr/share/nginx/html# 暴露容器的80端口
EXPOSE 80# 设置容器启动时执行的命令
CMD ["nginx", "-g", "daemon off;"]
在这个示例中,我们选择了一个基于最新版本的 Nginx 镜像作为基础镜像。然后,我们将自定义的 nginx.conf 配置文件复制到镜像中的 /etc/nginx/nginx.conf 路径下。接下来,我们将静态文件复制到镜像中的 /usr/share/nginx/html 路径下。然后,我们使用 EXPOSE 指令来声明容器运行时需要监听的端口,这里是80端口。最后,我们使用 CMD 指令来指定容器启动时要执行的命令,即运行 Nginx 并保持守护进程模式。
您可以将这个 Dockerfile 文件与您的 Nginx 配置文件和静态文件放在同一个目录下,并使用以下命令构建镜像:
docker build -t mynginx .
然后,您可以使用以下命令运行容器:
docker run -d -p 80:80 mynginx
这将启动一个容器,并将容器的80端口映射到主机的80端口,从而可以通过主机的80端口访问 Nginx 服务。
请注意,这只是一个简单的示例,实际的 Dockerfile 可能会更复杂,根据您的项目需求进行相应的配置和调整。
2、以Java Springboot项目为例
当您在Java中使用Spring Boot项目时,可以使用以下示例Dockerfile来构建和运行您的应用程序:
# 使用基础的Java镜像
FROM openjdk:8-jdk-alpine# 定义ARG指令传入jar包名称和文件路径
ARG JAR_FILE
ARG APP_HOME=/app# 创建应用目录
RUN mkdir -p ${APP_HOME}# 将jar包复制到应用目录
COPY ${JAR_FILE} ${APP_HOME}/app.jar# 设置工作目录
WORKDIR ${APP_HOME}# 暴露端口
EXPOSE 8080# 运行Spring Boot应用
CMD ["java", "-jar", "app.jar"]
使用该Dockerfile构建镜像时,可以通过–build-arg参数传入jar包名称和文件路径,例如:
docker build -t my-springboot-app --build-arg JAR_FILE=my-app.jar .
这将构建一个名为my-springboot-app的镜像,并将my-app.jar复制到镜像中的/app目录下。然后,可以通过运行该镜像来启动Spring Boot应用程序:
docker run -d -p 8080:8080 my-springboot-app
这将在本地的8080端口上运行您的Spring Boot应用程序。
3、多阶段构建示例(多次FROM)
在Dockerfile中,FROM指令用于指定基础镜像。虽然在一个Dockerfile中只能有一个FROM指令作为起点,但您可以使用多个FROM指令来构建多个阶段的镜像。每个FROM指令都会创建一个新的镜像层,并且可以在后续的指令中引用前面的镜像层。以下是一个示例:
# 第一个阶段:基于Node.js的构建阶段
FROM node:14 as builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build# 第二个阶段:基于Nginx的运行阶段
FROM nginx:latest
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
在上面的示例中,我们使用了两个FROM指令。第一个FROM指令使用了Node.js作为基础镜像,并在其中构建了应用程序。第二个FROM指令使用了Nginx作为基础镜像,并从第一个阶段的镜像中复制构建好的应用程序。这样可以将构建和运行分离,减小最终镜像的大小,并提高镜像的安全性。
四、docker build命令详解
docker build 命令用于从 Dockerfile 创建镜像。语法如下:
docker build [OPTIONS] PATH | URL | -
其中, PATH 是 Dockerfile 所在的路径, URL 是 Dockerfile 的 URL, - 表示从标准输入读取 Dockerfile。
docker build 命令可以使用以下选项:
-t:指定镜像的名称和标签。-f:指定 Dockerfile 的路径或 URL。-q:只显示镜像 ID。-no-cache:不使用缓存构建镜像。-build-arg:指定构建镜像时使用的参数。-force-rm:在构建镜像时删除中间容器。-target:指定构建镜像的目标阶段。
以下是 docker build 命令的一些示例:
# 从当前目录构建镜像
docker build -t my-image .# 从指定路径构建镜像
docker build -t my-image /path/to/Dockerfile# 从指定 URL 构建镜像
docker build -t my-image https://github.com/docker/dockerfile-examples/blob/master/nginx.dockerfile# 只显示镜像 ID
docker build -t my-image -q .# 不使用缓存构建镜像
docker build -t my-image -no-cache .# 指定构建镜像时使用的参数
docker build -t my-image -build-arg VERSION=1.0 .# 在构建镜像时删除中间容器
docker build -t my-image -force-rm .# 指定构建镜像的目标阶段
docker build -t my-image -target build .
docker build 命令是构建 Docker 镜像的常用命令。它可以用于从 Dockerfile 创建镜像,也可以从指定的路径或 URL 创建镜像。
补充说明--target参数
-target 参数用于指定构建镜像的目标阶段。当 Dockerfile 中定义了多个阶段时,可以使用 -target 参数来选择性地构建特定阶段的镜像。
在 Dockerfile 中定义多个阶段时,可以使用 AS 关键字为每个阶段命名。例如:
FROM base AS build
RUN apt-get update && apt-get install -y build-essentialFROM base AS test
RUN apt-get update && apt-get install -y curlFROM base AS deploy
COPY --from=build /app /app
COPY --from=test /test /test
在上面的示例中,Dockerfile 定义了三个阶段: build 、 test 和 deploy 。每个阶段都有一个特定的操作。 deploy 阶段依赖于 build 和 test 阶段的结果。
使用 -target 参数,可以选择性地构建特定的阶段。例如,要只构建 build 阶段的镜像,可以执行以下命令:
docker build -t my-image --target build .
这将只构建 build 阶段的镜像,并忽略其他阶段。通过 -target 参数,可以控制构建过程中所涉及的阶段,从而提高构建效率。
需要注意的是, -target 参数只能选择构建过程中的某个阶段,而不能选择构建过程中的某个指令。因此,指定的目标阶段必须在 Dockerfile 中明确定义。
-target 参数是一个有用的选项,特别适用于大型项目或复杂的构建流程,可以帮助减少构建时间并提高构建效率。
参考
Docker 官方文档:https://docs.docker.com/engine/reference/builder/
相关文章:
【docker】使用 Dockerfile 构建镜像
一、什么是Dockerfile Dockerfile 是用于构建 Docker 镜像的文本文件。它包含了一系列的指令,用于描述如何构建镜像的步骤和配置。 通过编写 Dockerfile,您可以定义镜像的基础环境、安装软件包、复制文件、设置环境变量等操作。Dockerfile 提供了一种可…...
计算机网络—— 概述
概述 1.1 因特网概述 网络、互联网和因特网 网络由若干结点和连接这些结点的链路组成多个网络还可以通过路由器互联起来,这样就构成了一个覆盖范围更大的网络,即互联网(或互连网)。因特网(Internet)是世…...
“超人练习法”系列06:如何更好地掌握技能?
01 掌握的阶段 关于人类学习新事物的最生动、最精妙的比喻,我是从笑来老师那里学到的。 他指出,学习新知识、新概念犹如在构建自己大脑皮层,每个习得的概念就像是大脑皮层上的一个个微小神经元。 一个看似聪明、博学的人,总能在各…...
【华为OD机试真题2023CD卷 JAVAJS】字符串拼接
华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 字符串拼接 知识点数组递归 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 给定M(0<M<=30)个字符(a-z),从中取出任意字符(每个字符只能用一次)拼接成长度为N(0<N<=5)的字符串,要求相同的字…...
【算法】链表-20240109
这里写目录标题 一、141. 环形链表二、876. 链表的中间结点三、面试题 02.01. 移除重复节点 一、141. 环形链表 简单 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中…...
机器学习系列--R语言随机森林进行生存分析(2)
随机森林(Breiman 2001a)(RF)是一种非参数统计方法,需要没有关于响应的协变关系的分布假设。RF是一种强大的、非线性的技术,通过拟合一组树来稳定预测精度模型估计。随机生存森林(RSF࿰…...
Flutter GetX 之 状态管理
上一篇文章为大家介绍了 GetX的 路由管理,让大家对GetX有了初步了解,今天为大家介绍一下GetX的 状态管理。 StatelessWidget 和 StatefulWidget 介绍 在介绍之前,先简单介绍一下 Flutter 页面的 StatelessWidget 和 StatefulWidget ,其实Flutter的本质是万物都是Widget,…...
e2studio开发磁力计LIS2MDL(1)----轮询获取磁力计数据
e2studio开发磁力计LIS2MDL.1--轮询获取磁力计数据 概述视频教学样品申请源码下载速率新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()prin…...
C++ 字符串大小写转换,替换,文件保存 方法封装
此示例程序方法已经封装好使用std::islower()函数可以检查一个字符是否是小写字母,使用std::isupper()函数可以检查一个字符是否是大写字母。 如果传入的字母是小写字母,则使用std::toupper()函数将其转换为大写字母,并输出转换后的结果。 如果输入的字母是大写字母,则使…...
计算机基础面试题 |19.精选计算机基础面试题
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...
mysql 添加用户并分配select权限
1.root用户先登录或者在可执行界面 1.1 选择mysql 点击mysql 或者在命令行 use mysql 1.2创建用户 CREATE USER username% IDENTIFIED BY password; 备注1:%替换为可访问数据库的ip,例如“127.0.0.1”“192.168.1.1”,使用“%”表示不限制…...
重新认识canvas,掌握必要的联结密码
查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…...
Linux第21步_取消鼠标中键的复制粘贴功能
在ubuntu18.04操作系统中,选中文本后,若按下鼠标中键,就可以执行复制粘贴,相当于 CtrlshiftC 后又按了 CtrlshiftV。在Linux系统中,基本上都是这么配置的。在windows系统中,我们习惯用Ctrl-C复制࿰…...
数学建模-Matlab R2022a安装步骤
软件介绍 MATLAB是一款商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分,可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程…...
【AI】Pytorch 系列:学习率设置
a. 有序调整:等间隔调整(Step),按需调整学习率(MultiStep),指数衰减调整(Exponential)和 余弦退火CosineAnnealing。 b. 自适应调整:自适应调整学习率 ReduceLROnPlateau。 c. 自定义调整:自定义调整学习率 LambdaLR。 #得到当前学习率 lr = next(iter(optimizer.param_gr…...
LeetCode第107题 - 二叉树的层序遍历 II
题目 解答 class Solution {List<List<Integer>> nodeLevels new LinkedList<>();public List<List<Integer>> levelOrderBottom(TreeNode root) {levelOrder(root, 0);List<List<Integer>> nodeLevels2 new LinkedList<>…...
java 常⽤的线程池模式FixedThreadPool
java 常⽤的线程池模式FixedThreadPool 线程池中的线程数量是固定的。 当提交一个新任务时,如果线程池中的线程都在运行,新任务就会被放入任务队列中等待执行。 如果线程池中的所有线程都在运行,且任务队列已满,那么线程池会创建新…...
双机调度算法
假设当前有两个处理机A、B,以及n个待处理的任务。第i个任务在处理处理机A上处理需要的时间为ai,在处理机B上处理的时间为bi,两个处理机可以并行处理任务,但单个处理机不能同时执行任务。要求给定n个任务及各个任务对应的ai 、bi&a…...
精进单元测试技能——Pytest断言的艺术
本篇文章主要是阐述Pytest在断言方面的应用。让大家能够了解和掌握Pytest针对断言设计了多种功能以适应在不同测试场景上使用。 了解断言的基础 在Pytest中,断言是通过 assert 语句来实现的。简单的断言通常用于验证预期值和实际值是否相等,例如…...
探索人工智能:深度学习、人工智能安全和人工智能
深度学习是人工智能的一种重要技术,它模拟了人类大脑神经网络的工作原理,通过建立多层次的神经元网络来实现对数据的分析和处理。这种技术的引入使得人工智能的发展进入到了一个新的阶段。 现如今,深度学习在各个领域都有着广泛的应用。例如…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
