首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Maven无法连接到码头内的网络

Maven无法连接到码头内的网络
EN

Stack Overflow用户
提问于 2017-08-26 05:07:34
回答 3查看 8.3K关注 0票数 2

我试图克隆一个git项目,并在一个码头做mvn package。但是maven无法连接到网络来下载依赖项。这是Dockerfile

代码语言:javascript
复制
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构建命令:

代码语言:javascript
复制
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期间,我得到了以下错误:

代码语言:javascript
复制
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]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-26 06:54:33

问题是,您正在传递构建args,但在您的Dockerfile中没有使用它们。传递参数与传递环境变量不同。

所以更新你的码头文件。另外,您有两个FROM,它们是有效的,因为现在是多阶段构建,但是您只需要在这里使用maven。

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

代码语言:javascript
复制
FROM maven
ARG http_proxy
ENV http_proxy=${http_proxy}
RUN git clone git@myhub.mygithub.com:project/myapp.git

这将设置完整映像的环境,并且当您运行映像时,代理将已经设置为容器。如果您只需要这样做git克隆,那么使用下面的方法

代码语言:javascript
复制
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

在默认情况下,有一个用于代理的部分是注释的。

代码语言:javascript
复制
   |-->
  <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还应该使用代理

票数 4
EN

Stack Overflow用户

发布于 2018-08-14 15:50:28

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

代码语言:javascript
复制
FROM maven
ARG MAVEN_OPTS
RUN ["mvn", "package"]

那么你的码头建造应该是这样的:

代码语言:javascript
复制
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" .
票数 8
EN

Stack Overflow用户

发布于 2017-08-26 07:16:29

您需要更新maven设置文件‘~/.m2/setings.xml’以添加代理配置。

代码语言:javascript
复制
<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步骤,用作为build传递的那些代理值占位符替换代理值占位符。

这比硬编码setting.xml中的代理值要好,因为您可能希望使用不同的代理来构建映像。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45892111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档