我试图克隆一个git项目,并在一个码头做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]发布于 2017-08-26 06:54:33
问题是,您正在传递构建args,但在您的Dockerfile中没有使用它们。传递参数与传递环境变量不同。
所以更新你的码头文件。另外,您有两个FROM,它们是有效的,因为现在是多阶段构建,但是您只需要在这里使用maven。
您可以通过两种方式构建您的文件
FROM maven
ARG http_proxy
ENV http_proxy=${http_proxy}
RUN git clone git@myhub.mygithub.com:project/myapp.git这将设置完整映像的环境,并且当您运行映像时,代理将已经设置为容器。如果您只需要这样做git克隆,那么使用下面的方法
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还应该使用代理
发布于 2018-08-14 15:50:28
实际上,您可以将MAVEN_OPTS作为构建参数传递,但是必须首先在Dockerfile中像这样声明它(还可以使用exec形式的run):
FROM maven
ARG MAVEN_OPTS
RUN ["mvn", "package"]那么你的码头建造应该是这样的:
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" .发布于 2017-08-26 07:16:29
您需要更新maven设置文件‘~/.m2/setings.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步骤,用作为build传递的那些代理值占位符替换代理值占位符。
这比硬编码setting.xml中的代理值要好,因为您可能希望使用不同的代理来构建映像。
https://stackoverflow.com/questions/45892111
复制相似问题