docker不build立一个新的干净的形象

我目前正在尝试一些例子,让我build立一个docker图像,复制一个Java应用程序,并运行tomcat访问特定端口上的应用程序。 我已经能够做到这一点,但是我有什么困难正在做出新的改变。 例如,如果我对控制器进行新的更改并构build应用程序,则在构builddocker时,似乎没有考虑这些更改。

我正在使用以下工具:主> docker文件夹中的Intellij Gradle Dockerfile

我运行以下命令:

gradle build ./gradlew buildDocker 

第二个命令在gradle.build文件中运行一个任务

 buildscript { repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.2.RELEASE") classpath('se.transmode.gradle:gradle-docker:1.2') } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'org.springframework.boot' apply plugin: 'war' apply plugin: 'docker' group = 'springio' jar { baseName = 'gs-serving-web-content' version = '0.1.0' } repositories { mavenCentral() } sourceCompatibility = 1.8 targetCompatibility = 1.8 dependencies { compile("org.springframework.boot:spring-boot-starter-web") testCompile('org.springframework.boot:spring-boot-starter-test') testCompile("junit:junit") } task buildDocker(type: Docker, dependsOn: build) { push = true applicationName = jar.baseName dockerfile = file('src/main/docker/Dockerfile') doFirst { copy { from jar into stageDir } } } 

这随后运行Dockerfile

 FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD gs-serving-web-content-0.1.0.jar app.jar RUN sh -c 'touch /app.jar' ENV JAVA_OPTS="" ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ] 

构build是部分失败

 > Docker execution failed Command line [docker push springio/gs-serving-web-content:latest] returned: unauthorized: authentication required 

但是,无论如何,图像被创build,然后我运行使用以下命令

 docker run -p 8080:8080 -t springio/gs-serving-web-content 

上面的命令运行tomcat,我可以访问本地主机上的控制器。

但是,正如我之前提到的,如果我对应用程序进行更改并执行上述所有构build步骤,则更改不会生效。

PS:我已经尝试停止和启动容器我杀了所有的容器我也删除了图像

它看起来像dockercaching也许?

任何帮助将不胜感激。

谢谢

从编写Dockerfiles的最佳实践 :

对于ADD和COPY指令,将检查映像中文件的内容,并为每个文件计算校验和。 这些校验和中不考虑文件的最后修改时间和最后访问时间。 在caching查找过程中,将校验和与现有映像中的校验和进行比较。 如果文件中有任何内容已经改变,如内容和元数据,则caching失效。

如果你不想使用caching,你可以运行docker build

–nocaching=真

选项,但是如果你的本地gs-serving-web-content-0.1.0.jar在运行新的docker build之前真的被改变了,你就不需要它了,因为caching应该已经失效了。

如果您停止并启动相同的容器,显然它不会在构build映像后获得更改(对于外部构build的应用程序),因为您必须创build一个新映像并基于该映像启动一个新容器。

所以我会仔细检查gs-serving-web-content-0.1.0.jar文件是否在docker build的目录下发生了改变。