Dockerfile - 中间容器到底在做什么?

2024-04-04

我有我的 Dockerfile,如下所示:

FROM confluentinc/cp-kafka-connect:4.0.0

ARG VERSION=0.0.2.15

RUN curl -Ls https://github.com/jcustenborder/kafka-connect-rabbitmq/releases/download/$VERSION/kafka-connect-rabbitmq-$VERSION.tar.gz | tar -xzC /tmp && \
mkdir -p /etc/kafka-connect/jars && \
cp -R /tmp/usr/share/kafka-connect/kafka-connect-rabbitmq/. /etc/kafka-connect/jars && \
ls -l /etc/kafka-connect/jars

RUN ls -l /etc/kafka-connect/jars

现在我面临的问题是当我首先这样做时ls我可以确认 JAR 已按我的预期复制。

然而当我这样做的时候ls in the RUN行,它们没有显示(随后当我运行图像时它们不会出现在我的容器中)。

所以我想了解为什么会发生这种情况?我是否错误地假设在每行图像传递之后 - 因为情况似乎并非如此。

仅供参考 - 这是我的控制台的完整输出:

Sending build context to Docker daemon   2.56kB
Step 1/4 : FROM confluentinc/cp-kafka-connect:4.0.0
 ---> 4db60f092134
Step 2/4 : ARG VERSION=0.0.2.15
 ---> Using cache
 ---> dc641b6beb04
Step 3/4 : RUN curl -Ls https://github.com/jcustenborder/kafka-connect-rabbitmq/releases/download/$VERSION/kafka-connect-rabbitmq-$VERSION.tar.gz | tar -xzC /tmp &&     cp /tmp/usr/share/kafka-connect/kafka-connect-rabbitmq/kafka-connect-rabbitmq-$VERSION.jar /usr/share/java/ &&     mkdir -p /etc/kafka-connect/jars &&     cp /tmp/usr/share/kafka-connect/kafka-connect-rabbitmq/*.jar /etc/kafka-connect/jars &&     ls -l /etc/kafka-connect/jars
 ---> Running in f48dbf0e487e
total 6804
-rw-r--r-- 1 root root  491199 Apr  2 03:48 amqp-client-4.2.0.jar
-rw-r--r-- 1 root root   74557 Apr  2 03:48 annotations-2.0.1.jar
-rw-r--r-- 1 root root  100811 Apr  2 03:48 connect-utils-0.3.101.jar
-rw-r--r-- 1 root root    7046 Apr  2 03:48 connect-utils-testing-data-0.3.101.jar
-rw-r--r-- 1 root root 1493680 Apr  2 03:48 freemarker-2.3.25-incubating.jar
-rw-r--r-- 1 root root 2256213 Apr  2 03:48 guava-18.0.jar
-rw-r--r-- 1 root root   55784 Apr  2 03:48 jackson-annotations-2.8.0.jar
-rw-r--r-- 1 root root  281079 Apr  2 03:48 jackson-core-2.8.5.jar
-rw-r--r-- 1 root root 1236315 Apr  2 03:48 jackson-databind-2.8.5.jar
-rw-r--r-- 1 root root  749499 Apr  2 03:48 javassist-3.19.0-GA.jar
-rw-r--r-- 1 root root   31212 Apr  2 03:48 kafka-connect-rabbitmq-0.0.2.15.jar
-rw-r--r-- 1 root root  129763 Apr  2 03:48 reflections-0.9.10.jar
-rw-r--r-- 1 root root   41071 Apr  2 03:48 slf4j-api-1.7.21.jar
Removing intermediate container f48dbf0e487e
 ---> ad2ca0767def
Step 4/4 : RUN ls -l /etc/kafka-connect/jars
 ---> Running in c0b5fda45249
total 0
Removing intermediate container c0b5fda45249
 ---> 5fef032d5aba
Successfully built 5fef032d5aba
Successfully tagged myfirstimage:latest

我必须使用某种“最终确定”命令吗?

任何帮助,将不胜感激。

Thanks.


我的猜测是/etc/kafka-connect/jars目录被声明为VOLUME在该图像的 Dockerfile 中。

和输出docker inspect命令证实了我的猜测:

$ docker image inspect confluentinc/cp-kafka-connect:4.0.0 --format '{{.Config.Volumes}}'
map[/etc/kafka-connect/secrets:{} /etc/kafka/secrets:{} /var/lib/kafka/data:{} /etc/kafka-connect/jars:{}]

引用自Dockerfile 规范 https://docs.docker.com/engine/reference/builder/#volume:

如果任何构建步骤在声明卷后更改了卷内的数据,则这些更改将被丢弃。

因此,以下是有关您的问题的详细信息:

  1. 基本图像声明VOLUME /etc/kafka-connect/jars.
  2. 在 Dockerfile 的第 3 步中,您更改了该目录的内容。这就是为什么ls此步骤中的命令正常工作。
  3. 然后这些更改将被丢弃。

解决方案是将jar文件放在您的主机上,并在运行容器时将主机目录绑定挂载到容器上。如下:

docker run -v /path/contains/jar/files:/etc/kafka-connect/jars <IMAGE>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dockerfile - 中间容器到底在做什么? 的相关文章

随机推荐

  • 我应该使用哪个 API 在 Windows 上播放音频? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在 Windows 上播放声音的方法有很多种 每种方法有哪些差异 优点和缺点 我知道至少有5种方法 1991 WinMM dll mm
  • 在 python 中使用 snappy 和 avro 时出现问题

    我正在读取 gz 文件并转换为 AVRO 格式 当我使用codec deflate 它运行良好 即 我能够转换为 avro 格式 当我使用codec snappy 它抛出一个错误 说明如下 raise DataFileException U
  • 如何使用 Python 裁剪通过鼠标单击选择的区域?

    我正在使用 Matplotlib 和 PIL 使用 python 需要查看图像选择并剪切我必须处理的区域 只留下所选区域的图像 我已经知道如何使用 pil 剪切 imagens 使用im crop 但是我如何选择坐标来通过鼠标单击裁剪图像
  • 调试 SSIS 包 - debug.writeline

    SSIS 中的调试体验不是我所期望的 我有一个脚本任务 我添加了一个Imports System Diagnostics在类的标题处 在代码中我有各种 debug writeline 尝试移动文件 类型的消息 但是 它们没有显示在输出窗口中
  • 如何开始测试(jMock)

    我正在尝试学习如何编写测试 我也在学习 Java 有人告诉我应该学习 使用 练习 jMock 我在网上找到了一些在一定程度上有帮助的文章 例如 http www theserverside com news 1365050 Using JM
  • 如何在画布上绘制圆的下半部分

    我正在尝试使用适当的 x cos theta y sin theta 函数绘制圆的下半部分 如果我将 theta 从 Math PI 迭代到 2 Math PI 我似乎得到了圆的上半部分 我在这段代码片段中做错了什么 window onlo
  • 如何使用 jest 和 TypeScript 模拟第三方 Nodejs 模块函数?

    我正在尝试模拟第三方节点模块中的函数 特别是fs readFileSync 功能 使用玩笑 那里有很多示例 但我还没有找到使用 TypeScript 的示例 我有一个简单的 希望是最小的例子 位于github https github co
  • .net 中的 [] 括号是什么? [复制]

    这个问题在这里已经有答案了 我在 C 中很少看到 这样的括号 但是当我开始学习 ASP NET 时 我已经看到它们很多次了 但我仍然无法理解它们的作用 它们不是用于数组的代码的一部分 例如 webmethods 就在方法之上 或者有一些在类
  • Android 10 后台扫描时有限制吗?

    Android 上的蓝牙扫描似乎有很多 隐藏功能 对于初学者来说 有一个 30 秒的限制 Android 7 0 ble扫描没有结果 https stackoverflow com questions 43114913 android 7
  • Python 缩进之谜

    为什么我会收到以下错误 最后print声明不应成为while loop gt gt gt while n gt 0 n n 1 print n print TO A File
  • 从给定的数据集 [纬度、经度、密度] 生成 KML 热图

    我希望构建一个静态 KML Google 地球标记 文件 该文件以 lat lon densis 元组的形式显示一些给定数据集的热图样式渲染 我拥有的一个非常简单的数据集是人口密度 我的要求是 必须能够输入给定纬度 经度的数据 必须能够指定
  • 为什么 solr RemoveDuplicatesTokenFilterFactory 不起作用?

    我的 schema xml 正在拆分产品名称 然后使用RemoveDuplicate 删除拆分后的重复单词
  • graph-tool 需要哪些安装依赖项/选项才能包含draw_hierarchy?

    我已经在 ubuntu 14 04 python 3 5 4 上安装了 graph tool 2 26 我可以使用图形工具 但它似乎不完整 例如我见过这个错误 AttributeError module graph tool draw ha
  • MvcContrib.MVC3-ci 和 Mvc.Contrib NuGet 包之间有什么区别?

    MvcContrib MVC3 ci 和 Mvc Contrib NuGet 包之间有什么区别 我看到它们有不同的依赖项 ci 有更多的下载 我假设我的 MVC3 项目需要 ci 但我如何解决这个问题 ci 是什么意思 据我收集的信息 MV
  • C# 中的三元运算符 (?:) 线程安全吗?

    考虑以下两种获得较大数字的替代方案currentPrice and 100 int price currentPrice gt 100 currentPrice 100 int price Math Max currentPrice 100
  • docker swarm init 无法选择 IP 地址错误

    尝试码头工人群 with 适用于 Mac 的 Docker 桌面 我试过这个 docker machine create d virtualbox node 1 docker machine create d virtualbox node
  • NSString:去掉 并为该段创建带有颜色的属性字符串?

    假设我有一个字符串 这是一个简单的字符串 我需要去掉 抱歉 b 和尖括号之间没有空格 由于某种原因预览没有显示它 同时将 simple 这个词加粗 我的想法是 将尖括号和 br 替换为空白 使 简单 段具有属性 问题是一旦标签被删除 我仍然
  • Eclipse Helios 不显示 Javadoc

    我最近买了一台新计算机 并在其中安装了 Eclipse Helios 之前 在我的旧计算机上 当我使用控制辅助 Ctrl 空格 并突出显示建议的方法时 该方法的 Javadoc 经常出现在控制辅助弹出窗口的一侧 其中包含方法描述和参数等 然
  • 锁定或保护 R 中的 data.table

    是否有一种或多种方法可以锁定或保护data table这样就不能再就地修改了 假设我们有一个 data table dt lt data table id 1 val foo dt id val 1 1 foo 然后我可以修改吗dt之后得到
  • Dockerfile - 中间容器到底在做什么?

    我有我的 Dockerfile 如下所示 FROM confluentinc cp kafka connect 4 0 0 ARG VERSION 0 0 2 15 RUN curl Ls https github com jcustenb