提交在/ workspace中生成的文件的容器更改(即使使用makefile)也不会保留到图像的新实例中

我正在使用一个生成大量文件的Java程序(即ANTLR使用语法生成parsing器)。 当我执行:

java -cp "/usr/local/lib/antlr-4.5-complete.jar:$CLASSPATH" org.antlr.v4.Tool Java8.g4 && javac *.java 

在使用Docker镜像的交互式shell中,某些java文件及其类在当前目录中生成。

但是当我在Dockerfile中使用以下方法执行此操作时:

 RUN java -cp "/usr/local/lib/antlr-4.5-complete.jar:$CLASSPATH" org.antlr.v4.Tool Java8.g4 && javac *.java 

该文件似乎并没有生成。

任何原因为什么发生这种情况,我怎么也许可以纠正这个使用Dockerfile中的RUN指令生成文件?

更新1:更多的信息,我的Dockerfile看起来像这样:

 FROM blah/blah_java MAINTAINER blabla RUN apt-get install -y make wget RUN mkdir -p /usr/java && wget -O java.tar.gz http://download.oracle.com/otn-pub/java/jdk/8u40-b25/jdk-8u40-linux-x64.tar.gz --header "Cookie: oraclelicense=accept-securebackup-cookie" && tar xfz java.tar.gz -C /usr/java ENV JAVA_HOME /usr/java/jdk1.8.0_40 ENV PATH $PATH:$JAVA_HOME/bin . . . RUN mkdir -p /usr/local/lib && cd /usr/local/lib && wget http://www.antlr.org/download/antlr-4.5-complete.jar ENV CLASSPATH=".:/usr/local/lib/antlr-4.5-complete.jar:$CLASSPATH" . . . RUN mkdir -p /workspace/antlr-test/ ADD Java8.g4 /workspace/antlr-test/ WORKDIR /workspace/antlr-test/ RUN java -cp "/usr/local/lib/antlr-4.5-complete.jar:$CLASSPATH" org.antlr.v4.Tool Java8.g4 && javac *.java 

更新2:在build筑物上输出这样的东西:

 Step 1 : FROM blah/blah_java ---> ff083dedeeac Step 2 : MAINTAINER blabla ---> Using cache ---> b2cc75d73e93 Step 3 : RUN apt-get install -y make wget ---> Using cache ---> e8f8162ca496 Step 4 : RUN mkdir -p /usr/java && wget -O java.tar.gz http://download.oracle.com/otn-pub/java/jdk/8u40-b25/jdk-8u40-linux-x64.tar.gz --header "Cookie: oraclelicense=accept-securebackup-cookie" && tar xfz java.tar.gz -C /usr/java ---> Using cache ---> 1587950d483a Step 5 : ENV JAVA_HOME /usr/java/jdk1.8.0_40 ---> Using cache ---> 1787ea5c62c4 Step 6 : ENV PATH $PATH:$JAVA_HOME/bin ---> Using cache ---> 5f9082023d2c . . . Step 10 : RUN mkdir -p /usr/local/lib && cd /usr/local/lib && wget http://www.antlr.org/download/antlr-4.5-complete.jar ---> Using cache ---> 7a67f6c4c572 Step 11 : ENV CLASSPATH ".:/usr/local/lib/antlr-4.5-complete.jar:$CLASSPATH" ---> Using cache ---> c64a24b809f0 . . . Step 14 : RUN mkdir -p /workspace/antlr-test/ ---> Using cache ---> 27b18aab274f Step 15 : ADD Java8.g4 /workspace/antlr-test/ ---> Using cache ---> 87ace495d90b Step 16 : WORKDIR /workspace/antlr-test/ ---> Using cache ---> 31089935532b Step 17 : RUN java -cp "/usr/local/lib/antlr-4.5-complete.jar:$CLASSPATH" org.antlr.v4.Tool Java8.g4 && javac *.java ---> Using cache ---> 773c302ecf5e Successfully built 773c302ecf5e 

更新3:在最后的RUN指令中有'ls':

 RUN java -cp "/usr/local/lib/antlr-4.5-complete.jar:$CLASSPATH" org.antlr.v4.Tool Java8.g4 && javac *.java && ls -la 

我发现生成的文件已正确列出。 这是在承诺的变化,这是行不通的。

更新4:我也发现在图像的交互式shell中,文件被生成。 但是当我提交更改时,下次运行这些更改时不可见。 在执行一个docker diff之前,我发现生成的文件在这里不会被监听。

更新5:如果生成的文件位于/ workspace目录下的其中一个子目录中,则不会在图像构build/提交中持久保存。 如果他们被创造出外部工作空间,他们似乎坚持通过构build/提交。

Interesting Posts