spring-boot - gradle连续构建技巧在docker容器中不起作用

标签 spring-boot docker gradle docker-compose

嗨,我正在尝试使用here描述的技巧来允许在docker容器内进行连续构建。当我在主机上打开两个单独的终端时,此技巧可以正常工作,但在docker容器中使用时,该技巧将失败。
docker-compose.yml

  build_server:
    image: gradle:6.3.0-jdk8
    working_dir: /home/gradle/server
    volumes:
      - ./server:/home/gradle/server
    command: ["gradle", "build", "--continuous", "-x", "test"]

  server:
    image: gradle:6.3.0-jdk8
    working_dir: /home/gradle/server
    volumes:
      - ./server:/home/gradle/server
    ports:
      - 8080:8080
    depends_on:
      - build_server
    restart: on-failure
    command: ["gradle", "bootRun"]
我从服务器容器得到的错误消息:
server_1         | FAILURE: Build failed with an exception.
server_1         |
server_1         | * What went wrong:
server_1         | Gradle could not start your build.
server_1         | > Could not create service of type ScriptPluginFactory using BuildScopeServices.createScriptPluginFactory().
server_1         |    > Could not create service of type ChecksumService using BuildSessionScopeServices.createChecksumService().
server_1         |       > Timeout waiting to lock checksums cache (/home/gradle/server/.gradle/checksums). It is currently in use by another Gradle instance.
server_1         |         Owner PID: unknown
server_1         |         Our PID: 31
server_1         |         Owner Operation: unknown
server_1         |         Our operation:
server_1         |         Lock file: /home/gradle/server/.gradle/checksums/checksums.lock
似乎gradle已在本地缓存文件上添加了锁,并阻止了bootRun任务在其他容器中运行。但是,当我在主机上的两个终端上运行任务时,或者仅在主机终端上运行build_server容器并运行bootRun时,此技巧很好用。我不知道为什么它在docker容器中不起作用。感谢您的提前帮助!

最佳答案

通过为服务器容器设置其他项目缓存目录找到了解决方法。即用以下命令替换命令

command: ["gradle", "bootRun", "--project-cache-dir=/tmp/cache"]
可能不是最好的解决方案,但它确实可以解决gradle锁引起的问题。

关于spring-boot - gradle连续构建技巧在docker容器中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62929155/

相关文章:

spring-boot - 未创建 GraphQLSchema bean - Spring Boot

java - 如何找出特定端点是否在 Spring Boot 中启用了 keepalive?

wordpress - 如何处理 Docker 镜像中的安全更新?

docker - 为什么 docker 无法将/bin/sh -c 识别为有效的入口点?

java - Gradle:将 native 库与现有的外部库链接

android - 无法解析 : multidex-instrumentation

spring-boot - Spring Security 基本身份验证总是得到 401

java - 在 Spring Boot Gradle 项目中导入 JWT(JSON Web Token)有困难

docker - 运行开发容器exec bash无法响应

java - Gradle 依赖项不是在 Gradle 缓存中创建的吗?