docker必须在构建阶段启动java / afow应用程序,它应该在运行阶段可用。但是,启动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应用程序启动的情况下立即放弃此步骤。
然而,即使“sleep 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
答案 0 :(得分:2)
好吧,它应该是ENTRYPOINT而不是RUN。容器启动时调用入口点,这就是我需要的。 RUN在构建期间执行,但它只影响文件系统。 Docker镜像不包含应用程序的执行状态,因此在创建映像时,它没有关于已启动的应用程序的信息。要启动应用程序,必须将它们设置为ENTRYPOINT