Java 为什么我的docker CI图像不可复制/到处运行
我有一个做CI的Dockerfile 它使用第三方tarball的内容,而第三方tarball又包含Java运行时的部分内容(是的,它很难看) 在执行过程中,一台主机上的Dockerfile需要“../jre/../strong>服务器/libjvm.so”,而在另一台主机上执行Dockerfile则需要该tarball中的“../jre/../strong>客户端/libjvm.so” Docker版本到处都是1.7.1 除了git repo文件夹(./)和tarball之外,没有任何内容添加到容器中。 这怎么可能? 是否有任何隐式传递给docker的共享环境变量 Dockerfile的外观如下所示:Java 为什么我的docker CI图像不可复制/到处运行,java,docker,boot2docker,Java,Docker,Boot2docker,我有一个做CI的Dockerfile 它使用第三方tarball的内容,而第三方tarball又包含Java运行时的部分内容(是的,它很难看) 在执行过程中,一台主机上的Dockerfile需要“../jre/../strong>服务器/libjvm.so”,而在另一台主机上执行Dockerfile则需要该tarball中的“../jre/../strong>客户端/libjvm.so” Docker版本到处都是1.7.1 除了git repo文件夹(./)和tarball之外,没有任何内容添加
FROM ubuntu:14.04
...
WORKDIR /
RUN wget http://SOME-URL TOOL-PACKAGE
RUN tar xf TOOL-PACKAGE
...
# setup some envs
ENV
# extend PATH
ENV PATH $PATH: ...
...
COPY ./ src
WORKDIR src
# use tool to generate some input files
RUN SOME-TOOL-BINARY-WHICH-USES-JRE
# continue build with make
RUN make
当您可以在构建过程中修改
java
执行时,您可以显式地传递-client
或-server
参数,以选择是使用客户机还是服务器JVM
有关详细信息,您可以查看。您的
Dockerfile
的这一部分在构建Java应用程序时是什么样子的?在Docker外部(例如在控制台上)构建时,对两台主机的影响是否相同?对于“主机”和“运行Docker的主机”,所需的文件相同,但对于不同的主机,所需的文件不同。这对我来说很奇怪,因为容器应该完全隔离,不是吗?是的,容器进程总是独立运行。但它们仍然共享同一个系统内核。我不知道java
程序根据哪些信息决定是选择服务器还是客户机JVM。也许这与您运行的内核有关。请看一下我关于如何指定JVM的回答,该JVM应该用于更具可复制性的构建。不幸的是,使用Java的“工具箱”是一个黑盒子,我无法控制使用哪种变体。我仍然在问自己,由于while“Toolbox”包是自包含的,docker容器是隔离的,这在不同的主机之间会有什么不同。但它们仍然共享主机的系统内核。意味着在两台主机上可能安装了不同的内核,这可能会影响java
程序选择客户机或服务器JVM的策略。
FROM ubuntu:14.04
...
WORKDIR /
RUN wget http://SOME-URL TOOL-PACKAGE
RUN tar xf TOOL-PACKAGE
...
# setup some envs
ENV
# extend PATH
ENV PATH $PATH: ...
...
COPY ./ src
WORKDIR src
# use tool to generate some input files
RUN SOME-TOOL-BINARY-WHICH-USES-JRE
# continue build with make
RUN make