【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 语句来实现的。简单的断言通常用于验证预期值和实际值是否相等,例如…...
探索人工智能:深度学习、人工智能安全和人工智能
深度学习是人工智能的一种重要技术,它模拟了人类大脑神经网络的工作原理,通过建立多层次的神经元网络来实现对数据的分析和处理。这种技术的引入使得人工智能的发展进入到了一个新的阶段。 现如今,深度学习在各个领域都有着广泛的应用。例如…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
