Dockerizing的橱柜

嗨,我试图在docker运行的橱柜

我的docker-compose.yml文件的一部分:

ambry: build: resources/ambry 

和Dockerfile:

 FROM alpine:latest USER root RUN \ apk update && \ apk upgrade && \ apk add git && \ apk add bash && \ apk add openjdk8 && \ rm -rf /var/cache/apk/* ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk WORKDIR /tmp CMD ["sh"] RUN git clone https://github.com/linkedin/ambry.git WORKDIR ambry RUN ./gradlew allJar WORKDIR target CMD mkdir logs CMD java -Dlog4j.configuration=file:../config/log4j.properties -jar ambry.jar --serverPropsFilePath ../config/server.properties --hardwareLayoutFilePath ../config/HardwareLayout.json --partitionLayoutFilePath ../config/PartitionLayout.json > logs/server.log & CMD java -Dlog4j.configuration=file:../config/log4j.properties -cp "*" com.github.ambry.frontend.AmbryFrontendMain --serverPropsFilePath ../config/frontend.properties --hardwareLayoutFilePath ../config/HardwareLayout.json --partitionLayoutFilePath ../config/PartitionLayout.json > logs/frontend.log & 

我正在执行shell中的这些命令,这些命令来自https://github.com/linkedin/ambry 。 和工作正常,但docker开始刚出口..:

 dockerized_ambry_1 exited with code 0 

任何一个知道它为什么存在?

https://docs.docker.com/engine/reference/builder/#cmd

Dockerfile中只能有一个CMD指令。 如果列出多个CMD则只有最后一个CMD才会生效。

看起来你实际运行的唯一的CMD是“运行Java类com.github.ambry.frontend.AmbryFrontendMain ”。 但是,您将其作为后台进程启动(您指定& )。

容器生命周期与“启动后台任务”紧密相连,立即完成。 因此容器立即退出。


由于您的容器负责启动两个服务( ambry.jarcom.github.ambry.frontend.AmbryFrontendMain ):您将希望将容器生命周期与 两个服务绑定,并且您将希望将任何SIGTERM发送到容器,优雅地closures这两个

我build议使用init系统来启动和结束这些服务。 Alpine Linux通常使用OpenRC ,但IIRC Dockerized Alpine Linux没有任何init系统,因此您需要find一个可以自己安装的变体。

就我个人而言,我发现在Docker中使用init系统是不平凡的:最常见的问题是日志不会转到容器的stdout; 直到你克服它,它可以是一个黑匣子。 祝你好运!

 FROM quantumobject/docker-alpine USER root RUN \ apk update && \ apk upgrade && \ apk add git && \ apk add bash && \ apk add openjdk8 && \ rm -rf /var/cache/apk/* ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk RUN git clone https://github.com/linkedin/ambry.git WORKDIR ambry/target RUN cd .. && ./gradlew allJar RUN mkdir logs RUN java -Dlog4j.configuration=file:../config/log4j.properties -jar ambry.jar --serverPropsFilePath ../config/server.properties --hardwareLayoutFilePath ../config/HardwareLayout.json --partitionLayoutFilePath ../config/PartitionLayout.json > logs/server.log && /sbin/my_init & CMD java -Dlog4j.configuration=file:../config/log4j.properties -cp "*" com.github.ambry.frontend.AmbryFrontendMain --serverPropsFilePath ../config/frontend.properties --hardwareLayoutFilePath ../config/HardwareLayout.json --partitionLayoutFilePath ../config/PartitionLayout.json > logs/frontend.log && /sbin/my_init 

工作:)谢谢birchlabs

这是完整的工作解决scheme:

https://github.com/maciejbak85/ambry-docker