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.jar
, com.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: