Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker多级不';不要呼叫入口点_Docker_Grails_Docker Multi Stage Build - Fatal编程技术网

Docker多级不';不要呼叫入口点

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

我在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.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
那样重置元数据才能运行。两个容器是最好的选择——一个容器几乎总是启动一个且只有一个进程。