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
- AWS ECS任务 – angular度构build不会停止运行
- 在AWS beanstalk下将特定的EBS卷挂载到Docker
- 对于Web应用程序,为模板和api服务器分配两个容器是否有意义?
- AWS泊坞窗设置 – 无caching标志
- EFS卷未安装在Elastic Beanstalk上的Docker容器上
- 使用docker在AWS EC2上设置和缩放titan / cassandra
- 在AWS Elastic Beanstalk上使用Docker进行Django迁移
- ElasticBeanstalk Docker主机networking模式
- 如何在AWS Elastic Beanstalk Docker容器中loggingPHP错误