我目前正在尝试一些示例,这些示例允许我构建一个docker镜像,在其中复制java应用程序并运行tomcat以访问特定端口上的该应用程序。 我已经能够实现这一点,但我遇到的困难是做出新的改变。 例如,如果我对控制器进行了新的更改并构建了应用程序,那么当我构建docker时,它似乎不会考虑这些更改。
我使用以下工具: 的IntelliJ 摇篮 主> docker文件夹中的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" ]
构建部分失败
> Docker execution failed
Command line [docker push springio/gs-serving-web-content:latest] returned:
unauthorized: authentication required
然而,无论如何都会创建图像,然后使用以下命令运行
docker run -p 8080:8080 -t springio/gs-serving-web-content
上面的命令运行tomcat,我可以访问localhost上的控制器。
但是,正如我之前提到的,如果我对应用程序进行了更改并执行了上述所有构建步骤,则更改不会生效。
PS: 我试过停止并启动容器 我杀了所有的容器 我也删除了图片
看起来Docker正在缓存它吗?
任何帮助将不胜感激。
由于
答案 0 :(得分:0)
来自Best practices for writing Dockerfiles:
对于ADD和COPY指令,文件的内容在 检查图像并计算每个文件的校验和。该 文件的最后修改时间和上次访问时间不是 在这些校验和中考虑。在缓存查找期间,校验和 与现有图像中的校验和进行比较。如果有什么 已更改文件,如内容和元数据,然后 缓存无效。
如果您根本不想使用缓存,可以使用
运行docker build- 无缓存=真
选项,但如果您的本地gs-serving-web-content-0.1.0.jar在运行新的docker构建之前确实已更改,则您不需要它,因为缓存应该已经失效。< / p>
如果停止并启动相同的容器,显然它在构建映像后没有完成对外部构建的应用程序的更改,因为您必须构建一个新映像并启动一个新容器它
所以我会仔细检查文件gs-serving-web-content-0.1.0.jar在docker build找到它的目录中是否真的发生了变化。