在Docker中运行Ignite(是:一般的Java-Docker问题)

我试图在git中提交的Docker容器(Mac OS X,Docker 1.9.1)中运行点火:

# Start from a Java image. FROM java:7 # Ignite version ENV IGNITE_VERSION 1.5.0-b1 WORKDIR /opt/ignite ADD http://www.us.apache.org/dist/ignite/1.5.0-b1/apache-ignite-fabric-1.5.0-b1-bin.zip /opt/ignite/ignite.zip # Ignite home ENV IGNITE_HOME /opt/ignite/apache-ignite-fabric-1.5.0-b1-bin RUN unzip ignite.zip RUN rm ignite.zip # Copy sh files and set permission ADD ./run.sh $IGNITE_HOME/ RUN chmod +x $IGNITE_HOME/run.sh CMD $IGNITE_HOME/run.sh 

在将其本地构build到apache/ignite并使用以下命令运行映像后,容器“挂起”

 docker run --expose=4700-4800 -it -p 47500-47600:47500-47600 -p 47100-47200:47100-47200 --net=host -e "CONFIG_URI=https://raw.githubusercontent.com/apache/ignite/master/examples/config/example-default.xml" apacheignite/ignite-docker 

当连接到容器( docker exec -ti apache/ignite /bin/bash )并通过bash在详细模式下运行命令时,它挂在org.apache.ignite.startup.cmdline.CommandLineRandomNumberGenerator

 bash -x /opt/ignite/apache-ignite-fabric-1.5.0-b1-bin/bin/ignite.sh https://raw.githubusercontent.com/apache/ignite/master/examples/config/example-default.xml 

输出地点挂起:

 + CP='/opt/ignite/apache-ignite-fabric-1.5.0-b1-bin/libs/*:/opt/ignite/apache-ignite-fabric-1.5.0-b1-bin/libs/ignite-indexing/*:/opt/ignite/apache-ignite-fabric-1.5.0-b1-bin/libs/ignite-spring/*:/opt/ignite/apache-ignite-fabric-1.5.0-b1-bin/libs/licenses/*' ++ /usr/bin/java -cp '/opt/ignite/apache-ignite-fabric-1.5.0-b1-bin/libs/*:/opt/ignite/apache-ignite-fabric-1.5.0-b1-bin/libs/ignite-indexing/*:/opt/ignite/apache-ignite-fabric-1.5.0-b1-bin/libs/ignite-spring/*:/opt/ignite/apache-ignite-fabric-1.5.0-b1-bin/libs/licenses/*' org.apache.ignite.startup.cmdline.CommandLineRandomNumberGenerator 

看看CommandLineRandomNumberGenerator的代码,我没有看到任何特殊的东西,只是一行来生成一个UUID。 是否还有其他的东西是以某种方式自动启动,导致locking威胁,使应用程序无法退出?

这似乎是一般的Java的docker问题,另请参阅: https : //github.com/docker/docker/issues/18180

可能的解决scheme

  • 创build一个docker机器,并在这里运行(cfr。https: //github.com/docker/docker/issues/18180#issuecomment-162568282 ):

    docker-machine创build-d virtualbox –engine-storage-driver覆盖overlaymachine

  • 在每个主要方法的最后添加System.exit(0)(cfr。https ://github.com/docker/docker/issues/18180#issuecomment-161129296 )

  • 等待下一个docker补丁版本( https://github.com/docker/docker/issues/18180#issuecomment-170656525

我认为将System.exit添加到Ignite中的所有主要方法是一种很好的做法(因为这是独立于docker或linux上的替代黑客)(linux内核需要AUFS升级,而许多机器可能会在此之前落后) 。 这样未来的Ignite版本也可以安全地安装在较旧的内核上。