Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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容器不在后台启动Java_Java_Docker_Undertow - Fatal编程技术网

docker容器不在后台启动Java

docker容器不在后台启动Java,java,docker,undertow,Java,Docker,Undertow,docker必须在构建阶段启动java/undertow应用程序,并在运行阶段可用。然而,在java进程启动后,和java服务器启动相关的容器更改不会持久化 所以在这一步中所做的更改不会对图像产生影响 我的docker文件中的最后一个命令是 RUN java -jar /svc/app/svc-0.0.1-SNAPSHOT.jar $2>server.log & sleep 5 运行此容器时,我可以看到server.log文件中存在输出,确认服务器已成功启动 StartServi

docker必须在构建阶段启动java/undertow应用程序,并在运行阶段可用。然而,在java进程启动后,和java服务器启动相关的容器更改不会持久化

所以在这一步中所做的更改不会对图像产生影响

我的docker文件中的最后一个命令是

RUN java -jar /svc/app/svc-0.0.1-SNAPSHOT.jar $2>server.log & sleep 5
运行此容器时,我可以看到server.log文件中存在输出,确认服务器已成功启动

StartServices        - Services Started 
但是当我运行容器时,没有服务在运行。我可以手动启动,但这不是我想要的方式。我想在容器启动时启动服务器

通知

& sleep 5
如果我不等待这5秒钟,将不会创建任何日志。Docker会立即放弃这一步骤,而不让我的java应用程序启动

然而,即使“睡眠5”让我的应用程序启动,docker仍然忽略图像中的更改,不应用它们

因此,当我执行“docker run”时,我的应用程序没有运行

以下是Dockerfile:

FROM anapsix/alpine-java
ENV  TC_BASE=/opt/tc_base
ENV  APP_BASE=$TC_BASE/svc
ENV  PATH=.:$PATH


RUN apk update && apk add unzip


COPY files/build/lib/svc/target/svc-0.0.1-SNAPSHOT-bin.zip $APP_BASE/
COPY files/build/lib/api/src/main/resources/api.properties $TC_BASE/conf/api/
COPY files/build/lib/svc/src/main/resources/svc.properties $TC_BASE/conf/svc/
COPY files/build/lib/svc/src/main/resources/logback.xml $TC_BASE/conf/svc/

RUN cd $APP_BASE ; unzip -q svc-0.0.1-SNAPSHOT-bin.zip ; rm svc-0.0.1-SNAPSHOT-bin.zip ; mv svc-0.0.1-SNAPSHOT/* . ; rm -rf svc-0.0.1-SNAPSHOT

EXPOSE 7009

RUN java -jar $TC_BASE/svc/app/svc-0.0.1-SNAPSHOT.jar $2>server.log & sleep 5

嗯,应该是入口点而不是运行。Entrypoint在容器启动时被调用,这正是我所需要的。
RUN在构建时执行,但它只影响文件系统。Docker映像不包含应用程序的执行状态,所以在创建映像时,它不包含有关已启动的应用程序的信息。为了启动应用程序,必须将它们设置为入口点

如果没有等待的进程,Docker将始终停止容器。您应该
tail-f server.log
我们正在讨论构建映像。在此阶段,没有人对服务器日志感兴趣。若我执行tail-fserver.log,那个么构建过程将永远不会结束。Java进程应该作为映像设置的一部分在后台运行。如果在容器运行时需要运行某些东西,则需要将其放入
入口点
CMD
(或组合)中。如果这是编排和启动多个项目,那么您可能需要一个入口点脚本。这一切听起来有点混乱。为什么您需要在容器中运行多个东西?您是否介意显示用于构建映像的
Dockerfile
?它显示了什么
docker logs containerid
您似乎在使用java容器,并将jar文件作为某种服务运行。容器映像运行您的jar文件。此时映像已经生成,需要生成映像才能运行
docker