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应用程序启动。
然而,即使"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
应该是ENTRYPOINT而不是RUN。入口点在容器启动时被调用,这是我所需要的。RUN在构建时执行,但是它只影响文件系统。Docker镜像不包含应用程序的执行状态,所以当镜像被创建时,它不包含已经启动的应用程序的信息。为了启动应用程序,必须将它们设置为ENTRYPOINT