在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参考示例,显示了推荐的基本用法。