【发布时间】:2020-11-05 19:04:58
【问题描述】:
您好,我正在尝试使用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 容器中不起作用。感谢您提前提供帮助!
【问题讨论】:
-
如果您挂载相同的 gradle 主文件夹或项目文件夹(锁定文件所在的位置),我很确定每个容器中的守护进程都需要能够相互通信。但我不知道使用了哪些端口以及如何使其工作,如果可能的话......
-
@BjørnVester 感谢您的信息。在那种情况下,也许我应该在一个容器中运行这两个任务?
-
是的,这可能会奏效。
标签: spring-boot docker gradle docker-compose