Ignite 运行 in Docker (is: General Java-Docker issue)

Ignite running in Docker (is: General Java-Docker issue)

我正在尝试 运行 在 Docker 容器(Mac OS X,Docker 1.9.1)中点燃 git:

# 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

在本地构建到 apache/ignite 并使用以下命令 运行 安装图像后,容器 'hangs'

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。是否有其他以某种方式自动启动导致锁定威胁从而使应用程序无法退出的东西?

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

可能的几种解决方案:

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