在 Docker 中构建 gradle 项目
Build gradle project inside a Docker
我有一个简单的 gradle 项目,我想在 Docker 容器中构建它
我有一个多阶段 docker 构建。第一阶段只是从 github 克隆项目。第二阶段必须构建项目,这样我才能在最后阶段 运行 它。但它在
上失败了
FROM gradle:4.2.1-jdk8-alpine
WORKDIR /app
COPY --from=0 /app/myProject /app
RUN ./gradlew build --stacktrace
命令 ./gradlew build --stacktrace
无法执行并失败并出现错误:
FAILURE: Build failed with an exception.
* What went wrong:
Could not update /app/.gradle/3.5-rc-2/file-changes/last-build.bin
和堆栈跟踪:
org.gradle.api.UncheckedIOException: Could not update /app/.gradle/3.5-rc-2/file-changes/last-build.bin
at org.gradle.api.internal.changedetection.state.FileTimeStampInspector.updateOnFinishBuild(FileTimeStampInspector.java:72)
at org.gradle.api.internal.changedetection.state.BuildScopeFileTimeStampInspector.stop(BuildScopeFileTimeStampInspector.java:38)
at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:98)
.....
Caused by: java.io.FileNotFoundException: /app/.gradle/3.5-rc-2/file-changes/last-build.bin (Permission denied)
at java.io.FileOutputStream.open0(Native Method)
......
为什么docker用户没有在工作目录中创建文件的权限以及如何添加这些权限?
简单 RUN chmod 777 /app
不起作用并告诉我:chmod: /app: Operation not permitted
根据 Dockerfile for gradle:4.2.1-jdk8-alpine at , it has "gradle" 作为其默认用户。您从应用程序目录复制到 docker 图片应用程序目录的文件可能没有 "gradle" 用户的正确权限.
您应该在 Dockerfile 中添加三个额外的命令来设置正确的权限:
FROM gradle:4.2.1-jdk8-alpine
WORKDIR /app
COPY --from=0 /app/myProject /app
USER root # This changes default user to root
RUN chown -R gradle /app # This changes ownership of folder
USER gradle # This changes the user back to the default user "gradle"
RUN ./gradlew build --stacktrace
另一种选择是使用 ADD
命令代替 COPY
,然后使用它的 --chown
选项在复制后更改文件的所有者。所以最终的 Dockerfile 会更简单。
FROM gradle:4.2.1-jdk8-alpine
WORKDIR /app
ADD --chown=gradle:gradle /app/myProject /app
RUN ./gradlew build --stacktrace
我有一个简单的 gradle 项目,我想在 Docker 容器中构建它
我有一个多阶段 docker 构建。第一阶段只是从 github 克隆项目。第二阶段必须构建项目,这样我才能在最后阶段 运行 它。但它在
上失败了FROM gradle:4.2.1-jdk8-alpine
WORKDIR /app
COPY --from=0 /app/myProject /app
RUN ./gradlew build --stacktrace
命令 ./gradlew build --stacktrace
无法执行并失败并出现错误:
FAILURE: Build failed with an exception.
* What went wrong:
Could not update /app/.gradle/3.5-rc-2/file-changes/last-build.bin
和堆栈跟踪:
org.gradle.api.UncheckedIOException: Could not update /app/.gradle/3.5-rc-2/file-changes/last-build.bin
at org.gradle.api.internal.changedetection.state.FileTimeStampInspector.updateOnFinishBuild(FileTimeStampInspector.java:72)
at org.gradle.api.internal.changedetection.state.BuildScopeFileTimeStampInspector.stop(BuildScopeFileTimeStampInspector.java:38)
at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:98)
.....
Caused by: java.io.FileNotFoundException: /app/.gradle/3.5-rc-2/file-changes/last-build.bin (Permission denied)
at java.io.FileOutputStream.open0(Native Method)
......
为什么docker用户没有在工作目录中创建文件的权限以及如何添加这些权限?
简单 RUN chmod 777 /app
不起作用并告诉我:chmod: /app: Operation not permitted
根据 Dockerfile for gradle:4.2.1-jdk8-alpine at , it has "gradle" 作为其默认用户。您从应用程序目录复制到 docker 图片应用程序目录的文件可能没有 "gradle" 用户的正确权限.
您应该在 Dockerfile 中添加三个额外的命令来设置正确的权限:
FROM gradle:4.2.1-jdk8-alpine
WORKDIR /app
COPY --from=0 /app/myProject /app
USER root # This changes default user to root
RUN chown -R gradle /app # This changes ownership of folder
USER gradle # This changes the user back to the default user "gradle"
RUN ./gradlew build --stacktrace
另一种选择是使用 ADD
命令代替 COPY
,然后使用它的 --chown
选项在复制后更改文件的所有者。所以最终的 Dockerfile 会更简单。
FROM gradle:4.2.1-jdk8-alpine
WORKDIR /app
ADD --chown=gradle:gradle /app/myProject /app
RUN ./gradlew build --stacktrace