如何增加多行内容到文件

文章目录

    • 1. 写在最前面
      • 1.1 问题说明
      • 1.2 问题解决
        • 1.2.1 次优解
        • 1.2.2 中优解
        • 1.2.3 最优解
      • 1.3 最优解引发的问题
    • 2. Buildx 介绍
      • 2.1 安装
      • 2.2 介绍
        • 2.2.1 特点
        • 2.2.2 工作原理
    • 3. 碎碎念
    • 4 参考资料

1. 写在最前面

遇到不懂问题的解决方式大概分为以下两种:

  • 正面解决,下次遇见的时候就可以完美绕过

  • 反面避开,每次遇到都会被坑一次

注:遇到困难不要慌,如果有临时性方案就先暂时绕过去,然后记录下不懂的地方,待到有时间的时候,抽丝剥茧详细分析一下原因。

1.1 问题说明

需要在 Dockerfile 的步骤中,增加配置 rsyslog 的日志切割规则的步骤。日志切割规则是一个多行的,从美观的角度,以多行的原始配置直接 append 到文件的末尾,为最优解。

1.2 问题解决

1.2.1 次优解

使用一个不是很美观,但是可以解决问题的方式。

RUN echo -e "if \$programname contains \"worker\" then {\n  set \$!trimed = \$programname;\n  call worker_rules\n}" >> /etc/rsyslog.d/rworker.conf
1.2.2 中优解

使用一个美观,但是表示起来稍显复杂的方式。

RUN echo 'if $programname contains "worker" then {' >> /etc/rsyslog.d/worker.conf && \echo '  set $!trimed = $programname;' >> /etc/rsyslog.d/worker.conf && \echo '  call worker_rules' >> /etc/rsyslog.d/worker.conf && \echo '}' >> /etc/rsyslog.d/worker.conf
1.2.3 最优解

使用 「Here Document」语法,以简洁且明了的方式

RUN cat <<EOF >> /etc/rsyslog.d/worker.conf
if \$programname contains "worker" then {set \$!trimed = \$programname;call worker_rules
}
EOF

注:Here Document 是一种在 Unix/Linux shell 编程中使用的特色语法,用于将多行文本直接嵌入到脚本中。这种语法特别适合于需要将多行字符串传递给命令或程序的场景。

1.3 最优解引发的问题

由于备选方案存在 3 种,但明显从简洁和易维护的角度上,闭眼也要选择「最优解」。但是就是这个最优解,让笔者额外加班了一个晚上。

结论:「传统的 Docker 构建引擎在处理多行字符串时可能会有一些限制,尤其是在 Here Document 语法的解析上。」

解决:「使用 BuildKit,BuildKit 是 Docker 的新构建引擎,它对 Dockerfile 中的许多语法特性提供了更好的支持,包括 Here Document。启用 BuildKit 后,Docker 能够更好地解析和执行复杂的命令。」

2. Buildx 介绍

2.1 安装

如果使用的是 Docker Desktop,则默认包含 Buildx。但如果使用的是 Linux 或更早版本的 Docker 则需要手动安装。

安装步骤:

$ mkdir ~/.docker/cli-plugins
$ wget https://github.com/docker/buildx/releases/download/v0.8.2/buildx-v0.8.2.linux-amd64
$ mv buildx-v0.8.2.linux-amd64 docker-buildx
$ chmod +x ~/.docker/cli-plugins/docker-buildx

注:不要使用 chatgpt 返回的 https://github.com/docker/buildx/releases/latest/download/buildx-$(uname -s)-$(uname -m) -o ~/.docker/cli-plugins/docker-buildx 这种方式,因为这个写法有问题

校验安装成功:

$ docker buildx version
github.com/docker/buildx v0.8.2 6224def4dd2c3d347eee19db595348c50d7cb491

使用 buildx 构建镜像的示例步骤:

docker buildx create --name mybuilder
docker buildx use mybuilder
docker buildx build --platform linux/amd64,linux/arm64 -t my_image:latest .

注:

启用 buildkit export DOCKER_BUILDKIT=1

禁用 export DOCKER_BUILDKIT=0

2.2 介绍

BuildKit 是 Docker 的一个现代构建引擎,它旨在提高 Docker 镜像的构建性能、灵活性和可扩展性。BuildKit 最初作为 Docker 的实验性功能引入,后来成为 Docker 的核心组成部分,支持更复杂的构建场景和优化。

2.2.1 特点

高效的构建缓存:BuildKit 支持更细粒度的缓存机制,能够缓存每个构建步骤的输出,减少重复构建的时间。它可以使用本地缓存和远程缓存(如 Docker Hub 或其他注册表)来加速构建过程。

并行构建:BuildKit 可以并行执行多个构建步骤,充分利用系统资源,加快整体构建速度。这是通过依赖关系分析来实现的,BuildKit 会识别可以独立执行的步骤并同时运行它们。

多平台支持:BuildKit 支持在不同的 CPU 架构和操作系统上构建镜像,如 amd64arm64arm。这使得开发者能够为多种设备(如服务器和嵌入式设备)构建兼容的镜像。

更灵活的 Dockerfile 语法:BuildKit 引入了一些新的语法和指令,例如 RUN --mount,允许在构建过程中挂载外部文件系统(如缓存、源代码等),从而提高构建的灵活性和可维护性。

输出格式自定义:BuildKit 允许用户自定义构建的输出格式,可以将构建的镜像推送到 Docker Hub 或其他容器注册表,或者导出为 tar 文件等格式。

安全性:BuildKit 提供了更好的安全性,通过构建上下文的隔离和构建步骤的限制,减少了潜在的攻击面。

2.2.2 工作原理

简述工作原理如下:

解析 Dockerfile:BuildKit 首先解析 Dockerfile,分析其中的指令和依赖关系,构建一个有向无环图(DAG),确定构建步骤的执行顺序。

构建上下文:BuildKit 收集构建所需的上下文,包括 Dockerfile、源代码、依赖文件等。

执行构建步骤:根据 DAG 的顺序,BuildKit 并行执行构建步骤。每个步骤的输出会被缓存,以便后续构建可以重用。

生成镜像:最后,BuildKit 将构建的结果打包成 Docker 镜像,并根据用户的配置将其推送到指定的容器注册表。

3. 碎碎念

chatgpt 真的可以让知识的学习和理解更加的快速!

  • 无论这个世界对你怎样,都请你一如既往的努力、勇敢、充满希望。

  • 当我们努力使自己变得比现在更好地时候, 我们周围的一切也会变得更好。

  • 长大之后越来越对年终总结祛魅,逐渐不再被「什么也没做」激起焦虑了。怎么会什么也没做呢,每天从床上爬起来的是你,每天好好吃饱饭的是你,被挫折击溃后艰难地痊愈了的是你,那些大笑的、哭泣的、潸然泪下的微小又动人的时刻,每一个都是你亲自经历的。生活是一条满是痛苦的沟壑,你是如此小心翼翼,才终于平安地站在年关前。

4 参考资料

  • Introducing BuildKit

  • linux - Output of a command within here-document - Stack Overflow

  • 使用 buildx 构建多种系统架构支持的 Docker 镜像

  • docker buildx | Docker Docs

  • Buildx · Docker 文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/496472.html

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

相关文章

多旋翼无人机理论 | 四旋翼动力学数学模型与Matlab仿真

多旋翼无人机理论 | 四旋翼动力学数学模型与Matlab仿真 力的来源数学模型数学模型总结Matlab 仿真 力的来源 无人机的动力系统&#xff1a;电调-电机-螺旋桨 。 给人最直观的感受就是 电机带动螺旋桨转&#xff0c;产生升力。 螺旋桨旋转产生升力的原因&#xff0c;在很多年…

Vue中动态样式绑定+CSS变量实现切换明暗主题功能——从入门到进阶

1.直接借助Vue的动态绑定样式绑定 Vue动态样式绑定 在Vue中&#xff0c;动态样式绑定是一种强大的功能&#xff0c;它允许开发者根据数据的变化动态地更新元素的样式。以下是对Vue动态样式绑定的详细知识梳理与详解&#xff1a; 一、基础知识 Vue的动态样式绑定主要通过v-b…

智能家居实训室中,STC单片机驱动的“互联网+”智能家居系统设计

一、引言 随着经济的快速发展&#xff0c;人们对家居环境的智能化、网络化需求日益增强&#xff0c;智能家居的研究也因此受到了国内外相关机构的广泛关注。STC单片机凭借其卓越的性能和广泛的应用领域&#xff0c;成为了智能家居系统设计的优选方案。作为一种先进的微控制器&…

计算机网络——期末复习(3)4-6章考试重点

第四章 根据IPv4第1个十进制数值判断&#xff0c;127以下为A类&#xff0c;128~191为B类&#xff0c;192~223为C类不能分配给主机或路由器接口的&#xff1a;A类网络号0和127&#xff0c;主机号全为0或全为1私有地址&#xff08;Private IP Address&#xff09;是指一类专门保…

内置ALC的前置放大器D2538A/D3308

一、概述 D2538A/D3308是芯谷科技推出的带有ALC&#xff08;自动电平控制&#xff09;的前置音频放大器芯片&#xff0c;最初产品为单声道/立体声收录机及盒式录音机而开发&#xff0c;作为录音/回放的磁头放大器使用&#xff1b;由于产品的高增益、低噪声及ALC外部可调的特性&…

【玩转MacBook】Git安装

Git 官网也提到了MacBook 可以使用 Homebrew 安装 Git&#xff0c;所以在此使用 Homebrew 安装。 1、安装 Homebrew 执行安装脚本 在 Terminal 中执行如下命令&#xff1a; /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.…

Speckly:基于Speckle文档的RAG智能问答机器人

前言 Speckly 是一个基于 检索增强生成 (RAG) 技术的智能问答机器人&#xff0c;它能像一位经验丰富的工程师&#xff0c;理解你的问题&#xff0c;并从 Speckle 文档中精准地找到答案。更厉害的是&#xff0c;它甚至可以帮你生成代码片段&#xff01;&#x1f680; 本文将详…

Excel无法插入新单元格怎么办?有解决方法吗?

在使用Excel时&#xff0c;有时会遇到无法插入新单元格的困扰。这可能是由于多种原因导致的&#xff0c;比如单元格被保护、冻结窗格、合并单元格等。本文将详细介绍3种可能的解决方案&#xff0c;帮助你顺利插入新单元格。 一、消冻结窗格 冻结窗格功能有助于在滚动工作表时保…

电子配件行业的未来之路:产品说明书数字化转型的力量

在科技飞速发展的今天&#xff0c;电子配件行业作为科技创新的前沿阵地&#xff0c;正经历着前所未有的变革。从智能手机、平板电脑到智能穿戴设备&#xff0c;各种新型电子配件层出不穷&#xff0c;极大地丰富了人们的生活。然而&#xff0c;随着产品种类的增多和功能的复杂化…

Python+Django 技术实现自动化漏洞扫描系统开发

作者简介 &#xff0c;徐师兄是一位拥有7年大厂经验的资深程序员&#xff0c;致力于Python技术领域的探索与实践&#xff0c;擅长毕业设计实战。他拥有超过12万的全网粉丝&#xff0c;是CSDN博客专家&#xff0c;也是掘金、华为云、阿里云和InfoQ等平台的优质作者。除了丰富的实…

EleutherAI/pythia-70m

EleutherAI/pythia-70m” 是由 EleutherAI 开发的一个小型开源语言模型&#xff0c;它是 Pythia Scaling Suite 系列中参数量最小的模型&#xff0c;拥有大约 7000 万个参数。这个模型主要旨在促进对语言模型可解释性的研究&#xff1b; Pythia Scaling Suite是为促进可解释性…

WinForm 美化秘籍:轻松实现 Panel 圆角虚线边框

文章目录 1、引言2、案例实现1、创建自定义 Panel 类2、定义圆角矩形3. 使用自定义 Panel4. 调整属性5、使用背景图片来实现5、拓展&#xff1a;使用 Panel 的 Paint重绘单独实现虚线边框效果 3、实现效果4、总结 1、引言 在 Winform 应用程序开发中&#xff0c;美化用户界面&…

Goland 安装与使用

GoLand安装 官方网址&#xff1a; JetBrains GoLand&#xff1a;不只是 Go IDE 1. 进入官网&#xff0c;点击下载&#xff1a; ​ 2. 如下图一步步安装 ​ ​ ​ ​ ​ 3. 如下图一步步安装

pdf有密码,如何实现pdf转换word?

PDF想要转换成其他格式&#xff0c;但是当我们将文件拖到PDF转换器进行转换的时候发现PDF文件带有密码怎么办&#xff1f;今天分享PDF有密码如何转换成word方法。 方法一、 PDF文件有两种密码&#xff0c;打开密码和限制编辑&#xff0c;如果是因为打开密码&#xff0c;建议使…

uniapp实现APP、小程序与webview页面间通讯

需求&#xff1a; 1、需要在Uniapp开发的APP或小程序页面嵌入一个H5网页&#xff0c;需要拿到H5给APP传递的数据。 2、并且这个H5是使用vuevant开发的。&#xff08;其实跟使用uniapp开发H5一样&#xff09; 实现步骤&#xff1a; 1、首先需要兼容多端和App端&#xff0c;因…

Vue开源项目Pure Admin二次开发:实现前后端柱状图

目标&#xff1a;在Vue开源项目Pure Admin的基础上&#xff0c;增加菜单和标签页&#xff0c;实现同期温度对比的柱状图&#xff0c;支持按时段查询。 先贴上效果图&#xff1a; 增加菜单 新建src\router\modules\weather.ts&#xff0c; export default {path: "/weat…

Markdown语法字体字号讲解

学习目录 语法详解改变字体样式[电脑要自带该样式字体]改变局部字号全局字体字号的设置使用场景及应用实例 > 快乐试试吧&#x1f603; &#x1f447; &#x1f447; &#x1f448;点击该图片即可跳转至Markdown学习网站进行 Markdown语法字体字号讲解&#x1f448;点击这里…

ESP-NETIF L2 TAP 接口-物联网嵌入式开发应用

ESP-NETIF L2 TAP 概述 ESP-NETIF L2 TAP 接口是 ESP-IDF 访问用户应用程序中的数据链路层&#xff08;OSI/ISO 中的 L2&#xff09;以进行帧接收和传输的机制。在嵌入式开发中&#xff0c;它通常用于实现非 IP 相关协议&#xff0c;如 PTP 和 Wake on LAN 等。 Tips : 目前…

xterm遇到的问题及解决方案

xterm遇到的问题及解决方案 /r插入终端导致的之后插入的数据覆盖了改行头部的数据 问题说明 如图所示&#xff0c;当在一行输入的候&#xff0c;输入的l插入到了改行的头部。 查看ws返回数据 可见ws返回的信息存在\r字符&#xff0c;在xterm.js中\r是回车字符的意思&…

springboot 工程使用proguard混淆

在 Maven 构建的 Spring Boot 项目中使用 ProGuard 进行代码混淆时&#xff0c;需要正确配置 Maven 插件和 ProGuard 的混淆规则。由于 Spring Boot 项目通常会依赖大量的反射机制和动态代理&#xff0c;因此必须特别小心确保这些部分在混淆过程中不会被破坏。 步骤 1&#xf…