• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Dockerfile - 中间容器究竟在做什么?

[复制链接]
菜鸟教程小白 发表于 2022-8-3 10:11:39 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有我的 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 已按预期复制。

然而,当我做第二个 lsRUN行,它们不会显示(随后当我运行图像时它们不会出现在我的容器中)。

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

仅供引用 - 这是我的控制台的完整输出:
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

我是否必须使用某种“终结”命令?

任何帮助,将不胜感激。

谢谢。



Best Answer-推荐答案


我的猜测是 /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:{}]

引用自 The Dockerfile Specification :

If any build steps change the data within the volume after it has been declared, those changes will be discarded.



因此,以下是有关您的问题的详细信息:
  • 基础镜像声明 VOLUME /etc/kafka-connect/jars .
  • 在 Dockerfile 的第 3 步中,您更改了该目录的内容。这就是为什么ls此步骤中的命令正常工作。
  • 然后丢弃这些更改。

  • 解决办法是将jar文件放在自己的宿主机上,运行容器时将宿主机目录绑定(bind)挂载到容器上。如下:
    docker run -v /path/contains/jar/files:/etc/kafka-connect/jars <IMAGE>
    

    关于Dockerfile - 中间容器究竟在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49604332/

    回复

    使用道具 举报

    懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关注0

    粉丝2

    帖子830918

    发布主题
    阅读排行 更多
    广告位

    扫描微信二维码

    查看手机版网站

    随时了解更新最新资讯

    139-2527-9053

    在线客服(服务时间 9:00~18:00)

    在线QQ客服
    地址:深圳市南山区西丽大学城创智工业园
    电邮:jeky_zhao#qq.com
    移动电话:139-2527-9053

    Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap