Dockerfile - 什么是中间容器正在做什么?

时间:2018-04-02 01:43:53

标签: docker dockerfile

我有我的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行中执行第二次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

我是否必须使用某种'最终确定'命令?

任何帮助都将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:7)

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

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

  

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

所以,以下是您的问题的详细信息:

  1. 基本图像声明VOLUME /etc/kafka-connect/jars
  2. 在Dockerfile的第3步中,您更改了该目录的内容。这就是为什么此步骤中ls命令正常工作的原因。
  3. 然后丢弃这些更改。
  4. 解决方案是将jar文件放在主机上,并在运行容器时将主机目录绑定到容器。如下:

    docker run -v /path/contains/jar/files:/etc/kafka-connect/jars <IMAGE>
    

答案 1 :(得分:1)

由于@Yuankun提到是正确的,但不仅是基本图像声明音量,而且也是当前的子图像。 检查孩子时

docker image inspect test --format '{{.Config.Volumes}}'

我得到了与基本图像相同的输出

map[/etc/kafka-connect/jars:{} /etc/kafka-connect/secrets:{} /etc/kafka/secrets:{} /var/lib/kafka/data:{}]

因此,如果您运行容器并且如果您在/etc/kafka-connect/jars中检查ls,那么该位置将没有任何内容可以解释为什么第二个ls什么也不返回。

结果不是由于在构建期间删除了中间容器而是在docker文件中cp的行为。

我在你的docker文件中做了一些更改。

     FROM confluentinc/cp-kafka-connect:4.0.0

    ARG VERSION=0.0.2.15
    RUN echo "Test again"
    RUN curl -Ls https://github.com/jcustenborder/kafka-connect-rabbitmq/releases/download/$VERSION/kafka-connect-rabbitmq-$VERSION.tar.gz | tar -xzC /tmp
    Run 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 cp -R /tmp/usr/share/kafka-connect/kafka-connect-rabbitmq/. 

    /etc/kafka-connect/jars && \
        ls -l /etc/kafka-connect/jars
        WORKDIR /etc/kafka-connect/jars

    ADD test.sh /usr/src/app/test.sh
    RUN chmod +x /usr/src/app/test.sh
   # ENTRYPOINT [ "/usr/src/app/test.sh" ]

当我构建这个docker镜像时,我得到了以下输出。我运行两次cp并输出两次正确的输出。

    Step 1/9 : FROM confluentinc/cp-kafka-connect:4.0.0
 ---> 4db60f092134
Step 2/9 : ARG VERSION=0.0.2.15
 ---> Using cache
 ---> d341c91e6b25
Step 3/9 : RUN echo "Test again"
 ---> Running in 6fdd5aa8c36e
Test again
Removing intermediate container 6fdd5aa8c36e
 ---> 491238cfb53c
Step 4/9 : RUN curl -Ls https://github.com/jcustenborder/kafka-connect-rabbitmq/releases/download/$VERSION/kafka-connect-rabbitmq-$VERSION.tar.gz | tar -xzC /tmp
 ---> Running in 732784416c75
Removing intermediate container 732784416c75
 ---> 27efd005b0be
Step 5/9 : Run 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
 ---> Running in ba93b4b53621
total 6804
-rw-r--r-- 1 root root  491199 Apr  2 06:10 amqp-client-4.2.0.jar
-rw-r--r-- 1 root root   74557 Apr  2 06:10 annotations-2.0.1.jar
-rw-r--r-- 1 root root  100811 Apr  2 06:10 connect-utils-0.3.101.jar
-rw-r--r-- 1 root root    7046 Apr  2 06:10 connect-utils-testing-data-0.3.101.jar
-rw-r--r-- 1 root root 1493680 Apr  2 06:10 freemarker-2.3.25-incubating.jar
-rw-r--r-- 1 root root 2256213 Apr  2 06:10 guava-18.0.jar
-rw-r--r-- 1 root root   55784 Apr  2 06:10 jackson-annotations-2.8.0.jar
-rw-r--r-- 1 root root  281079 Apr  2 06:10 jackson-core-2.8.5.jar
-rw-r--r-- 1 root root 1236315 Apr  2 06:10 jackson-databind-2.8.5.jar
-rw-r--r-- 1 root root  749499 Apr  2 06:10 javassist-3.19.0-GA.jar
-rw-r--r-- 1 root root   31212 Apr  2 06:10 kafka-connect-rabbitmq-0.0.2.15.jar
-rw-r--r-- 1 root root  129763 Apr  2 06:10 reflections-0.9.10.jar
-rw-r--r-- 1 root root   41071 Apr  2 06:10 slf4j-api-1.7.21.jar
Removing intermediate container ba93b4b53621
 ---> 530730db6dc3
Step 6/9 : Run cp -R /tmp/usr/share/kafka-connect/kafka-connect-rabbitmq/. /etc/kafka-connect/jars && ls -l /etc/kafka-connect/jars
 ---> Running in 6fdf56ea723a
total 6804
-rw-r--r-- 1 root root  491199 Apr  2 06:10 amqp-client-4.2.0.jar
-rw-r--r-- 1 root root   74557 Apr  2 06:10 annotations-2.0.1.jar
-rw-r--r-- 1 root root  100811 Apr  2 06:10 connect-utils-0.3.101.jar
-rw-r--r-- 1 root root    7046 Apr  2 06:10 connect-utils-testing-data-0.3.101.jar
-rw-r--r-- 1 root root 1493680 Apr  2 06:10 freemarker-2.3.25-incubating.jar
-rw-r--r-- 1 root root 2256213 Apr  2 06:10 guava-18.0.jar
-rw-r--r-- 1 root root   55784 Apr  2 06:10 jackson-annotations-2.8.0.jar
-rw-r--r-- 1 root root  281079 Apr  2 06:10 jackson-core-2.8.5.jar
-rw-r--r-- 1 root root 1236315 Apr  2 06:10 jackson-databind-2.8.5.jar
-rw-r--r-- 1 root root  749499 Apr  2 06:10 javassist-3.19.0-GA.jar
-rw-r--r-- 1 root root   31212 Apr  2 06:10 kafka-connect-rabbitmq-0.0.2.15.jar
-rw-r--r-- 1 root root  129763 Apr  2 06:10 reflections-0.9.10.jar
-rw-r--r-- 1 root root   41071 Apr  2 06:10 slf4j-api-1.7.21.jar
Removing intermediate container 6fdf56ea723a
 ---> ebe70157c1b9
Step 7/9 : WORKDIR /etc/kafka-connect/jars
Removing intermediate container 90bfc4ba1190
 ---> 6cc7949e289a
Step 8/9 : ADD test.sh /usr/src/app/test.sh
 ---> 0e98b550dac1
Step 9/9 : RUN chmod +x /usr/src/app/test.sh
 ---> Running in 07ceda6ab705
Removing intermediate container 07ceda6ab705
 ---> 37d4beaf3ba6
Successfully built 37d4beaf3ba6
Successfully tagged test:latest

当我运行容器时,那个位置上没有东西。

enter image description here

<强>解决方案:

1st:附加由docker构建过程创建的卷。

docker run --rm -it -v /etc/kafka-connect/jars:/etc/kafka-connect/jars test bash

所以这里是你的jar文件列表。

enter image description here

<强>第二 在入口点脚本中复制这些文件,以便它将保留在该位置 并且您不需要挂载任何本地jar文件并装载由docker build创建的卷。

创建test.sh

cp -R /tmp/usr/share/kafka-connect/kafka-connect-rabbitmq/. /etc/kafka-connect/jars
    exec "/bin/bash"

更新您的泊坞文件。

 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
WORKDIR /etc/kafka-connect/jars
ADD test.sh /usr/src/app/test.sh
RUN chmod +x /usr/src/app/test.sh
ENTRYPOINT [ "/usr/src/app/test.sh" ]

在这里,我们得到了我们需要的东西,而不需要付出任何努力

docker run --rm -it test bash

enter image description here