Maven无法连接到docker内的网络

时间:2017-08-26 05:07:34

标签: maven docker

我正在尝试克隆git项目并在docker中执行mvn package。但是maven无法连接到网络以下载依赖项。这是Dockerfile

FROM java:8
FROM maven
ADD id_rsa /root/.ssh/id_rsa
ADD known_hosts /root/.ssh/known_hosts
RUN git clone git@myhub.mygithub.com:project/myapp.git
WORKDIR myapp
RUN mvn package

这是maven构建命令:

sudo docker build --build-arg http_proxy=http://proxy.in.my.com:80  
--build-arg https_proxy=http://proxy.in.my.com:80  
--build-arg ftp_proxy=http://proxy.in.my.com:80  
--build-arg no_proxy=localhost,127.0.0.1,.us.my.com,.my.com   
-t myapp .  

我在mvn package期间收到以下错误:

Downloading: https://repo.maven.apache.org/maven2/org/jacoco/jacoco-maven-plugin/0.7.6.201602180812/jacoco-maven-plugin-0.7.6.201602180812.pom  

[ERROR] Plugin org.jacoco:jacoco-maven-plugin:0.7.6.201602180812 or one of its dependencies could not be resolved:   
Failed to read artifact descriptor for org.jacoco:jacoco-maven-plugin:jar:0.7.6.201602180812: Could not transfer artifact org.jacoco:jacoco-maven-plugin:pom:0.7.6.201602180812 from/to central (https://repo.maven.apache.org/maven2): Network is unreachable (connect failed) -> [Help 1]

3 个答案:

答案 0 :(得分:2)

问题是你传递的是构建args但是没有在Dockerfile中的任何地方使用它们。传递参数与传递Environment变量不同。

所以更新您的dockerfile。你也有两个FROM它们是有效的,因为现在有多阶段构建,但你只需要maven。

您可以通过两种方式构建文件

FROM maven
ARG http_proxy
ENV http_proxy=${http_proxy}
RUN git clone git@myhub.mygithub.com:project/myapp.git

这将设置完整图像的环境,当您运行图像时,代理将已经设置为容器。如果您只需要这个来进行git clone,那么请使用以下方法

FROM maven
ARG http_proxy
RUN http_proxy=${http_proxy} git clone git@myhub.mygithub.com:project/myapp.git

这只会设置克隆的参数,并且运行时图像不会使用代理。

修改-1

Maven似乎并不尊重http_proxy。所以你需要在maven配置中自己指定代理。配置位于maven图像内的/usr/share/maven/conf/settings.xml

有一个代理部分,默认情况下会发表评论

   |-->
  <proxies>
    <!-- proxy
     | Specification for one proxy, to be used in connecting to the network.
     |
    <proxy>
      <id>optional</id>
      <active>true</active>
      <protocol>http</protocol>
      <username>proxyuser</username>
      <password>proxypass</password>
      <host>proxy.host.net</host>
      <port>80</port>
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
    -->
  </proxies>

取消注释并在主机目录中创建配置文件。使用Dockerfile中的COPY命令复制文件。现在maven也应该使用代理

答案 1 :(得分:2)

实际上,您可以将MAVEN_OPTS作为构建参数传递,但首先必须像这样在Dockerfile中声明它(也可以使用run的exec形式):

FROM maven
ARG MAVEN_OPTS
RUN ["mvn", "package"]

然后您的docker构建将如下所示:

docker build -t my_image --build-arg http_proxy=http://proxy:3128 --build-arg https_proxy=http://proxy:3128 --build-arg MAVEN_OPTS="-Dhttp.proxyHost=proxy -Dhttp.proxyPort=3128 -Dhttps.proxyHost=proxy -Dhttps.proxyPort=3128" .

答案 2 :(得分:0)

您需要更新maven设置文件'〜/ .m2 / settings.xml'以添加代理配置。

<proxies>
 <proxy>
  <id>optional</id>
  <active>true</active>
  <protocol>$PROXY_PROTOCOL</protocol>
  <username>$PROXY_USER</username>
  <password>$PROXY_PASS</password>
  <host>$PROXY_HOST</host>
  <port>$PROXY_PORT</port>
  <nonProxyHosts>$NO_PROXY</nonProxyHosts>
 </proxy>
</proxies>

查看以下https://github.com/alirizasaral/Maven-with-Proxy/。您可以在向模板添加模板maven settings.xml的情况下执行非常类似的操作,并且可以在Dockerfile中执行envsubst步骤,将代理值占位符替换为作为构建参数传递的代理值占位符。

这比在settings.xml中对代理值进行硬编码更好,因为您可能希望使用不同的代理构建映像。