Dockercachinggradle依赖

我试图部署我们的Java Web应用程序来使用docker来弹性beanstalk,这个想法是能够在本地运行容器进行开发和testing,并最终将其推到使用git的生产。

我创build了一个安装了tomcat8和java8的基础镜像,执行gradle build的镜像inheritance了这个基础镜像,加速了构build过程。

除了事实上,使用docker构build的inheritance应用程序容器似乎不会cachinggradle依赖关系,它每次都会下载,包括gradlew。 我们使用以下命令构build我们的Web应用程序:

./gradlew war

有什么办法可以caching~/.gradle的文件,这将大大加速我的构build

这对于beanstalk来说并不是什么大问题,但是对于开发人员来说,这是一个很大的问题,因为这需要很多时间,正如你可以想象的那样

基础图像dockerfile:

 FROM phusion/baseimage EXPOSE 8080 RUN apt-get update RUN add-apt-repository ppa:webupd8team/java RUN apt-get update RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections RUN apt-get -y install oracle-java8-installer RUN java -version ENV TOMCAT_VERSION 8.0.9 RUN wget --quiet --no-cookies http://archive.apache.org/dist/tomcat/tomcat-8/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz -O /tmp/catalina.tar.gz # Unpack RUN tar xzf /tmp/catalina.tar.gz -C /opt RUN mv /opt/apache-tomcat-${TOMCAT_VERSION} /opt/tomcat RUN ln -s /opt/tomcat/logs /var/log/tomcat RUN rm /tmp/catalina.tar.gz # Remove unneeded apps RUN rm -rf /opt/tomcat/webapps/examples RUN rm -rf /opt/tomcat/webapps/docs RUN rm -rf /opt/tomcat/webapps/ROOT ENV CATALINA_HOME /opt/tomcat ENV PATH $PATH:$CATALINA_HOME/bin ENV CATALINA_OPTS $PARAM1 # Start Tomcat CMD ["/opt/tomcat/bin/catalina.sh", "run"] 

应用图片:

 FROM <tag name here for base image> RUN mkdir ~/.gradle # run some extra stuff here to add things to gradle.properties file # Add project Source ADD . /var/app/myapp # Compile and Deploy Application, this is what is downloading gradlew and all the maven dependencies every time, if only there was a way to take the changes it makes to ~/.gradle and persist it as a cache layer RUN cd /var/app/myapp/ && ./gradlew war RUN mv /var/app/myapp/build/libs/myapp.war /opt/tomcat/webapps/ROOT.war # Start Tomcat CMD ["/opt/tomcat/bin/catalina.sh", "run"] 

您可能需要考虑将应用程序映像分成两个映像:一个用于构buildmyapp.war,另一个用于运行应用程序。 这样,您可以在实际构build期间使用docker卷,并将主机的~/.gradle文件夹绑定到执行构build的容器中。 不是只有一个步骤来运行你的应用程序,但你会有更多的步骤。 例:

build造者图象

 FROM <tag name here for base image including all build time dependencies> # Add project Source # -> you can use a project specific gradle.properties in your project root # in order to override global/user gradle.properties ADD . /var/app/myapp RUN mkdir -p /root/.gradle ENV HOME /root # declare shared volume path VOLUME /root/.gradle WORKDIR /var/app/myapp/ # Compile only CMD ["./gradlew", "war"] 

应用程序映像

 FROM <tag name here for application base image> ADD ./ROOT.war /opt/tomcat/webapps/ROOT.war # Start Tomcat CMD ["/opt/tomcat/bin/catalina.sh", "run"] 

如何在您的项目根目录中使用,假设构build器Dockerfile位于那里,并且应用程序Dockerfile位于webapp子文件夹(或您喜欢的任何其他path):

 $ docker build -t builder . $ docker run --name=build-result -v ~/.gradle/:/root/.gradle/ builder $ docker cp build-result:/var/app/myapp/myapp.war webapp/ROOT.war $ cd webapp $ docker build -t application . $ docker run -d -P application 

我没有testing显示的代码,但我希望你明白了。 这个例子甚至可以通过为.gradle / cache使用数据卷来改进,详情请参阅Docker 用户指南 。

一世

在build.gradle中添加resolveDependencies任务:

 task resolveDependencies { doLast { project.rootProject.allprojects.each { subProject -> subProject.buildscript.configurations.each { configuration -> configuration.resolve() } subProject.configurations.each { configuration -> configuration.resolve() } } } } 

并更新Dockerfile:

 ADD build.gradle /opt/app/ WORKDIR /opt/app RUN gradle resolveDependencies ADD . . RUN gradle build -x test --parallel && \ touch build/libs/api.jar 

II

贝娄是我现在做的:

的build.gradle

 ext { speed = project.hasProperty('speed') ? project.getProperty('speed') : false offlineCompile = new File("$buildDir/output/lib") } dependencies { if (speed) { compile fileTree(dir: offlineCompile, include: '*.jar') } else { // ...dependencies } } task downloadRepos(type: Copy) { from configurations.all into offlineCompile } 

Dockerfile

 ADD build.gradle /opt/app/ WORKDIR /opt/app RUN gradle downloadRepos ADD . /opt/app RUN gradle build -Pspeed=true 

尝试更改gradle用户主目录

运行mkdir -p /opt/gradle/.gradle
ENV GRADLE_USER_HOME = / opt / gradle / .gradle