您好我正试图在泊坞窗中运行ambry
我的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。并且工作正常但是码头工人刚开始退出..:
dockerized_ambry_1 exited with code 0
任何人都知道它存在的原因吗?
答案 0 :(得分:1)
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发送到容器,优雅地关闭这两个。
我建议使用 init系统来启动&结束这些服务。 Alpine Linux typically uses OpenRC,但IIRC Dockerized Alpine Linux 不有任何init系统,因此您需要找到一个(或自己安装)的变体。
就我个人而言,我发现在Docker中使用init系统并非易事:最常见的问题是日志不会进入容器的标准输出;直到你克服了它,它可以是一个黑盒子。祝你好运!
答案 1 :(得分:0)
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
答案 2 :(得分:0)
这是完整的工作解决方案: