Spring boot gradle连续构建技巧不';不要在码头集装箱内工作

Spring boot gradle连续构建技巧不';不要在码头集装箱内工作,spring-boot,docker,gradle,docker-compose,Spring Boot,Docker,Gradle,Docker Compose,嗨,我正在尝试使用所描述的技巧来允许在docker容器内连续构建。当我在主机上打开两个单独的终端时,这个技巧可以很好地工作,但在docker容器中使用时失败 docker-compose.yml build_server: image: gradle:6.3.0-jdk8 working_dir: /home/gradle/server volumes: - ./server:/home/gradle/server command: ["

嗨,我正在尝试使用所描述的技巧来允许在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\u服务器
容器并在主机终端上运行
bootRun
时,这个技巧可以很好地工作。我想知道为什么它在docker容器中不起作用。谢谢你的帮助

通过为服务器容器设置不同的项目缓存目录,找到了一种解决方法。i、 e.将命令替换为以下命令:

command: ["gradle", "bootRun", "--project-cache-dir=/tmp/cache"]

可能不是最好的解决方案,但它确实避免了gradle锁造成的问题。

我非常确定,如果装载相同的gradle主文件夹或项目文件夹(锁文件所在的位置),每个容器中的守护进程都需要能够彼此通信。但我不知道使用了哪些端口以及如何使其工作,如果可能的话…@BjørnVester感谢您提供的信息。在这种情况下,也许我应该在一个容器中运行这两个任务?是的,这可能会起作用。这对我帮助很大,我在Vagrant和IntelliJ共享坐骑时遇到了同样的问题,这救了我!