在Docker中运行简单的Java Gradle应用程序

我有一个简单的Java服务器应用程序与Gradle构build。 它可以在我的主机上gradle run 。 但是,我想要在Docker镜像中构build这个镜像并作为Docker容器运行。

我正在使用docker机(版本0.13.0):

 docker-machine create --driver virtualbox --virtualbox-memory 6000 default docker-machine start eval $(docker-machine env default) 

我在Dockerfile有下面的Dockerfile图像构build脚本:

 FROM gradle:4.3-jdk-alpine ADD . /code WORKDIR /code CMD ["gradle", "--stacktrace", "run"] 

我可以完美地构build:

 ➜ docker build -t my-server-app . Sending build context to Docker daemon 310.3kB Step 1/4 : FROM gradle:4.3-jdk-alpine ---> b803ec92baec Step 2/4 : ADD . /code ---> Using cache ---> f458b0be79dc Step 3/4 : WORKDIR /code ---> Using cache ---> d98d04eda627 Step 4/4 : CMD ["gradle", "--stacktrace", "run"] ---> Using cache ---> 869262257870 Successfully built 869262257870 Successfully tagged my-server-app:latest 

当我尝试运行这个图像时:

 ➜ docker run --rm my-server-app FAILURE: Build failed with an exception. * What went wrong: Could not create service of type ScriptPluginFactory using BuildScopeServices.createScriptPluginFactory(). > Could not create service of type CrossBuildFileHashCache using BuildSessionScopeServices.createCrossBuildFileHashCache(). * Try: Run with --info or --debug option to get more log output. * Exception is: org.gradle.internal.service.ServiceCreationException: Could not create service of type ScriptPluginFactory using BuildScopeServices.createScriptPluginFactory(). at org.gradle.internal.service.DefaultServiceRegistry$FactoryMethodService.invokeMethod(DefaultServiceRegistry.java:797) <snip> ... 60 more Caused by: org.gradle.api.UncheckedIOException: Failed to create parent directory '/code/.gradle/4.3' when creating directory '/code/.gradle/4.3/fileHashes' at org.gradle.util.GFileUtils.mkdirs(GFileUtils.java:271) at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:56) 

为什么在创build该目录时遇到麻烦?

这应该是一个非常简单的任务,谁能告诉我他们如何得到这个简单的scheme工作?

仅供参考,运行当前版本的一切。 我在我的主机上使用了Gradle 4.3.1,以及Docker Hub的官方Gradle 4.3基础镜像,我在我的主机上使用了当前版本的JDK 8,而当前版本的docker,docker-machine和docker-撰写以及。

基于openjdk基础镜像到gradle镜像,我们可以看到gradle项目被设置为在/home/gradle运行。 检查这里的代码。 因为.gradle文件夹位于/home/gradle文件夹中,所以在新的工作目录/code运行gradle run时遇到问题。 如果您将代码复制/添加到/home/gradle您应该可以运行gradle run 。 这对我有效。

修正是在--chown=gradle/code目录中指定--chown=gradle权限。 许多Docker镜像被devise为以root身份运行,基本的Gradle镜像作为用户gradle运行。

 FROM gradle:4.3-jdk-alpine ADD --chown=gradle . /code WORKDIR /code CMD ["gradle", "--stacktrace", "run"] 

Ethan Davisbuild议使用/home/gradle而不是code 。 这可能会起作用,但我没有想到这一点。

Docker镜像维护者应该有一个简单的入门types参考示例,显示了推荐的基本用法。