我正在尝试克隆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]
答案 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中对代理值进行硬编码更好,因为您可能希望使用不同的代理构建映像。