码头工人没有建立一个新的清洁图像

时间:2016-12-17 15:08:20

标签: gradle docker

我目前正在尝试一些示例,这些示例允许我构建一个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正在缓存它吗?

任何帮助将不胜感激。

由于

1 个答案:

答案 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找到它的目录中是否真的发生了变化。