Dockerizing ambry

时间:2017-08-18 11:07:51

标签: docker docker-compose

您好我正试图在泊坞窗中运行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

任何人都知道它存在的原因吗?

3 个答案:

答案 0 :(得分:1)

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发送到容器,优雅地关闭这两个

我建议使用 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)

这是完整的工作解决方案:

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