Docker多级不';不要呼叫入口点
我在Docker中运行了一个grails应用程序,我试图添加ApacheDerby服务器,以便使用Docker multi-stage在同一映像中运行。但是当我添加Derby时,grails应用程序就不能运行了 所以我从这个开始:Docker多级不';不要呼叫入口点,docker,grails,docker-multi-stage-build,Docker,Grails,Docker Multi Stage Build,我在Docker中运行了一个grails应用程序,我试图添加ApacheDerby服务器,以便使用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
$ 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应用程序。但后来我又加上了德比
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服务器,并提出自己的入口点?或者这一切都是错误的,我真的应该使用多个容器吗?Docker在一个容器中有多个进程是可以的,但概念不同:一个容器,一个进程。单独拥有一个数据库当然是应该做的 现在Dockerfile的问题是,在声明了来自的第二个
之后,实际上已经放弃了迄今为止所做的大部分工作。您可以使用前一个阶段从中复制一些文件(这通常用于构建一些二进制文件),但Docker不会为您这样做,除非您明确定义要复制的内容。因此,您的实际入口点是在datagrip/derby server
image中声明的入口点
我建议您开始使用docker compose
。这是一个很好的工具,可以运行多个容器而不会出现复杂情况。使用这样的文件:
版本:“3.0”
服务:
应用程序:
建造:
上下文:。
数据库:
图:datagrip/derby服务器
docker compose将为应用程序生成一个映像(如果docker文件位于同一目录中,但可以自定义),并启动一个数据库。数据库可以作为“数据库”从应用程序容器访问(它是一个可解析的名称)。有关更多选项,请参阅。Docker可以在一个容器中有多个进程,但概念不同:一个容器,一个进程。单独拥有一个数据库当然是应该做的
现在Dockerfile的问题是,在声明了来自
的第二个之后,实际上已经放弃了迄今为止所做的大部分工作。您可以使用前一个阶段从中复制一些文件(这通常用于构建一些二进制文件),但Docker不会为您这样做,除非您明确定义要复制的内容。因此,您的实际入口点是在datagrip/derby server
image中声明的入口点
我建议您开始使用docker compose
。这是一个很好的工具,可以运行多个容器而不会出现复杂情况。使用这样的文件:
版本:“3.0”
服务:
应用程序:
建造:
上下文:。
数据库:
图:datagrip/derby服务器
docker compose将为应用程序生成一个映像(如果docker文件位于同一目录中,但可以自定义),并启动一个数据库。数据库可以作为“数据库”从应用程序容器访问(它是一个可解析的名称)。有关更多选项,请参阅。当您从
行中获得第二个时,它会丢弃之前的所有内容,并开始一个全新的图像;您需要COPY--from=
文件出现在那里的第一个图像,并且需要像默认的CMD
那样重置元数据才能运行。两个容器是最好的选择–一个容器几乎总是启动一个且仅启动一个进程。当您有第二个FROM
行时,它会丢弃之前的所有内容,并启动一个全新的映像;您需要COPY--from=
文件出现在那里的第一个图像,并且需要像默认的CMD
那样重置元数据才能运行。两个容器是最好的选择——一个容器几乎总是启动一个且只有一个进程。