我有一个运行在Docker中的grails应用程序,我正在尝试添加Apache Derby服务器,以便使用Docker multi stage在相同的映像中运行。但是当我添加Derby时,grails应用程序不会运行。
所以我从这个开始:
$ cat build/docker/Dockerfile
FROM azul/zulu-openjdk:13.0.3
EXPOSE 8080
VOLUME ["/AppData/derby"]
WORKDIR /app
COPY holder-0.1.jar application.jar
COPY app-entrypoint.sh app-entrypoint.sh
RUN chmod +x app-entrypoint.sh
RUN apt-get update && apt-get install -y dos2unix && dos2unix app-entrypoint.sh
ENTRYPOINT ["/app/app-entrypoint.sh"]到目前为止,这一切都很好,grails作为web服务器启动,我可以连接到web应用程序。但是后来我加入了Derby...
FROM azul/zulu-openjdk:13.0.3
EXPOSE 8080
VOLUME ["/AppData/derby"]
WORKDIR /app
COPY holder-0.1.jar application.jar
COPY app-entrypoint.sh app-entrypoint.sh
RUN chmod +x app-entrypoint.sh
RUN apt-get update && apt-get install -y dos2unix && dos2unix app-entrypoint.sh
ENTRYPOINT ["/app/app-entrypoint.sh"]
FROM datagrip/derby-server
WORKDIR /derby现在,当我启动容器时,Derby会运行,但grails应用程序根本不会运行。从终端上打印的内容可以明显看出这一点,但我也登录并执行了ps aux来验证它。
现在,我想我可以考虑创建自己的启动脚本来启动Derby服务器,尽管这似乎违反了两个映像配置的独立性。
其他人可能会说,我应该使用两个容器,但我希望保持简单,derby是一个非常简单的数据库,我觉得这里没有必要这么复杂。
我只是想把多级docker容器的概念推得太远了吗?
docker容器启动多个进程真的很正常吗?在前台启动grails之前,我是否必须编造自己的入口点,在后台启动Derby服务器?或者这一切都是错的,我真的应该使用多个容器?
发布于 2021-01-25 22:20:23
Docker可以在一个容器中拥有多个进程,但概念不同:一个容器,一个进程。有一个单独的数据库肯定是应该这样做的。
现在Dockerfile的问题是,在声明了第二个FROM之后,您实际上已经丢弃了到目前为止所做的大部分工作。您可以使用前一个阶段来复制其中的一些文件(这通常用于构建一些二进制文件),但Docker不会为您执行此操作,除非您显式定义要复制的内容。因此,您的实际入口点就是在datagrip/derby-server图像中声明的入口点。
我建议您开始使用docker-compose。这是一个很好的工具,可以运行多个容器,而不会产生复杂的问题。使用这样的文件:
version: "3.0"
services:
app:
build:
context: .
database:
image: datagrip/derby-serverdocker-compose将为应用程序构建一个映像(如果Dockefile在同一目录中,但可以自定义),并启动一个数据库。可以从应用程序容器中以“database”(它是一个可解析的名称)来访问数据库。有关更多选项,请参阅this reference。
https://stackoverflow.com/questions/65886137
复制相似问题