npm Jenkins如何使用HTTP_PROXY后面的Dockerfile构建Docker映像?

tv6aics1  于 2023-01-13  发布在  Jenkins
关注(0)|答案(8)|浏览(168)

构建Docker映像可以在桌面上正常工作。安装Node.js NPM依赖项可以正常工作。但是,当使用托管在公司代理后的持续集成服务器(如Jenkins)时,构建Docker映像会失败。

Node.js NPM依赖项

在构建Node.js包时,如果在克隆GIT依赖项时无法连接到GIT,则命令npm install会失败。

e1ce5e8407d1: Already exists
Status: Image is up to date for node:0.10.33
 ---> e1ce5e8407d1
Step 1 : RUN mkdir -p /usr/src/app
 ---> Using cache
 ---> 965cad0c68b0
Step 2 : WORKDIR /usr/src/app
 ---> Using cache
 ---> 4c498f0c07e9
Step 3 : COPY package.json /usr/src/app/
 ---> b0662a8275fb
Removing intermediate container 5aca20551452
Step 4 : RUN npm install
 ---> Running in 7ccf9e5362af
npm WARN package.json newww@2.0.0 No README data
npm WARN package.json Dependency 'async-cache' exists in both dependencies and devDependencies, using 'async-cache@^0.1.5' from dependencies
npm ERR! git clone https://github.com/npm/npm2es.git Cloning into bare repository '/root/.npm/_git-remotes/https-github-com-npm-npm2es-git-60a75edb'...
npm ERR! git clone https://github.com/npm/npm2es.git fatal: unable to access 'https://github.com/npm/npm2es.git/': Failed to connect to github.com port 443: Connection timed out

Java Maven、Ruby、Go Docker映像及其依赖项

构建Java、Ruby或Go容器时也会发生同样的情况,其中依赖项位于公司代理服务器上的存储库服务器中。
知道可以使用HTTP_PROXY环境变量配置Docker后,如何正确配置Docker以在CI环境中正确构建映像?

kmpatx3s

kmpatx3s1#

注:Docker 1.9 * 可能 * 有助于解决此问题:

  • Issue 14634“:生成器-生成时参数传递(例如HTTP_PROXY
  • PR 15182“:支持在生成上下文中传递生成时变量

用途(拟定):

docker build --build-arg http_proxy=http://my.proxy.url  --build-arg foo=bar <<MARK
FROM busybox
RUN <command that need http_proxy>
ARG --description="foo's description" foo
USER $foo
MARK
hwazgwia

hwazgwia2#

Docker有多种方法来设置在不同时间生效的代理。
如果您的docker build必须通过代理检索基本映像,则需要指定build-arg s:

docker build --build-arg HTTP_PROXY=$http_proxy \
--build-arg HTTPS_PROXY=$http_proxy --build-arg NO_PROXY="$no_proxy" \
--build-arg http_proxy=$http_proxy --build-arg https_proxy=$http_proxy \
--build-arg no_proxy="$no_proxy" -t myContainer /path/to/Dockerfile/directory

其中$http_proxy$no_proxy是在我的bashrc中设置的。我使用了HTTP_PROXYhttp_proxy,因为不同的实用程序将检查不同的变量(curl检查两者,wget只检查小写的变量,等等)。
如果您的docker build有一个**RUN curl/wget/etc命令必须通过代理**,您需要在您的docker映像中指定一个环境变量:

ENV https_proxy=http://proxy-us02.company.com:8080
ENV http_proxy=http://proxy-us02.company.com:8080
ENV HTTP_PROXY=http://proxy-us02.company.com:8080
ENV HTTPS_PROXY=http://proxy-us02.company.com:8080
ENV no_proxy="localhost,localdomain,127.0.0.1,etc"
ENV NO_PROXY="localhost,localdomain,127.0.0.1,etc"

如果您不希望在运行时将此环境变量包含在映像中,则可以在最后删除所有这些变量:

RUN unset http_proxy https_proxy no_proxy HTTP_PROXY HTTPS_PROXY NO_PROXY
uqjltbpv

uqjltbpv3#

Docker守护程序HTTP代理

关于为Docker守护进程设置HTTP_PROXY环境变量,有很多文档可供使用。该环境变量仅在运行container时可用,因此在这里它对我们没有帮助。

Dockerfile中的解决方案

尽管在Dockerfile中设置环境变量HTTP_ENVhttp_env可能会有所帮助,但它对我们的目标也没有帮助。
ENV http_proxy http://proxy.mycompany.com:80
原因是每个特定的服务只以不同的方式设置HTTP代理。我可以解决的方法如下。

  • NPM:NPM需要使用CLI命令设置HTTP_PROXY变量。
  • GIT:GIT还需要使用CLI命令设置HTTP_PROXY变量。
  • MAVEN:MVN命令要求将HTTP_PROXY设置为用户目录**~/.m2/settings.xml**下的XML文件。对于Docker,您可以将其添加到根目录的“/root/.m2/settings.xml”目录(不安全,仅用于开发),或添加到Docker文件的用户主目录。

例如,使用Dockerfile运行应用程序,我可以使用以下Dockerfile构建映像:

FROM node:0.10.33

# Prepare
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Use the cache for dependencies
COPY package.json /usr/src/app/

# If building behind an http_proxy, set them for git and npm
RUN git config --global http.proxy http://qypprdproxy02.ie.company.net:80 && \
    npm config set proxy http://qypprdproxy02.ie.company.net:80 && \
    npm config set https-proxy http://qypprdproxy02.ie.company.net:80

# Install dependencies
RUN npm install

# Copy all the source
COPY . /usr/src/app

# Execute the dev steps
COPY ./numbat-config.example.js /usr/src/app/numbat-config.js
COPY ./.env.example /usr/src/app/.evn
RUN touch /usr/src/app/config.admin.js

注意,我已经使用CLI命令配置了GIT和NPM,以便在运行NPM install命令之前显式地获取代理设置,这样,NPM和GIT依赖项将分别被自动检索和克隆。
使用此Dockerfile构建映像的结果如预期工作:

[root@pppdc9prd6dq newww]# fig build
...
...
Building npmregistryserver...
 ---> Using cache
 ---> 965cad0c68b0
Step 2 : WORKDIR /usr/src/app
 ---> Using cache
 ---> 4c498f0c07e9
Step 3 : COPY package.json /usr/src/app/
 ---> ae8ff7861246
Removing intermediate container ba1d7b8c9963
Step 4 : RUN npm config set proxy http://qypprdproxy02.ie.company.net:80 &&     npm config set https-proxy http://qypprdproxy02.ie.company.net:80 &&     npm install
 ---> Running in aa6e05d9c7a4
npm WARN package.json newww@2.0.0 No README data
npm WARN package.json Dependency 'async-cache' exists in both dependencies and devDependencies, using 'async-cache@^0.1.5' from dependencies
npm WARN deprecated extend@1.1.3: Please update to the latest version.

> v8flags@1.0.8 install /usr/src/app/node_modules/gulp/node_modules/v8flags
> node fetch.js

> hiredis@0.1.17 install /usr/src/app/node_modules/hiredis
> node-gyp rebuild

make: Entering directory '/usr/src/app/node_modules/hiredis/build'
  CC(target) Release/obj.target/hiredis/deps/hiredis/hiredis.o
  CC(target) Release/obj.target/hiredis/deps/hiredis/net.o
  CC(target) Release/obj.target/hiredis/deps/hiredis/sds.o
  CC(target) Release/obj.target/hiredis/deps/hiredis/async.o
  AR(target) Release/obj.target/deps/hiredis.a
  COPY Release/hiredis.a
  CXX(target) Release/obj.target/hiredis/src/hiredis.o
  CXX(target) Release/obj.target/hiredis/src/reader.o
  SOLINK_MODULE(target) Release/obj.target/hiredis.node
  SOLINK_MODULE(target) Release/obj.target/hiredis.node: Finished
  COPY Release/hiredis.node
make: Leaving directory '/usr/src/app/node_modules/hiredis/build'
npm WARN engine hawk@0.10.2: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})

> pngcrush-bin@1.0.0 postinstall /usr/src/app/node_modules/imagemin-pngcrush/node_modules/pngcrush-bin
> node lib/install.js

     fetch : https://raw.githubusercontent.com/imagemin/pngcrush-bin/v1.0.0/vendor/linux/pngcrush

✔ pre-build test passed successfully!

> dtrace-provider@0.3.1 install /usr/src/app/node_modules/npm-typeahead/node_modules/restify/node_modules/dtrace-provider
> scripts/install.js

npm WARN engine cryptiles@0.1.3: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})
npm WARN engine sntp@0.1.4: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})
npm WARN engine boom@0.3.8: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})
npm WARN engine hoek@0.7.6: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})
npm WARN cannot run in wd newww@2.0.0 gulp build (wd=/usr/src/app)
newww-metrics@1.0.0 node_modules/newww-metrics

murmurhash@0.0.2 node_modules/murmurhash

npm-humans@2.0.1 node_modules/npm-humans

leven@1.0.1 node_modules/leven

chunk@0.0.2 node_modules/chunk

npm-expansions@1.14.0 node_modules/npm-expansions

similarity@1.0.1 node_modules/similarity

truncate@1.0.4 node_modules/truncate

这按预期正常工作,您可以在http代理后面有一个CI/CD环境,以基于此Dockerfile重建映像。

omvjsjqw

omvjsjqw4#

从Docker 17.07开始,您也可以使用Docker客户端配置文件集中提供代理配置:
https://docs.docker.com/network/proxy/#configure-the-docker-client

mutmk8jj

mutmk8jj5#

我们正在...

ENV http_proxy http://9.9.9.9:9999
ENV https_proxy http://9.9.9.9:9999

并且在停靠文件的末尾...

ENV http_proxy ""
ENV https_proxy ""

现在(直到docker引入构建环境变量),允许代理变量用于构建而不公开它们

3b6akqbq

3b6akqbq6#

我遇到了一个问题,当企业网络不允许下载和设置docker图像,所以n/w给http代理信息。而运行docker图像构建,我传递了变量,它的工作没有任何问题。

docker build  --build-arg http_proxy="http://userid:pwd@iaisystem.com:8080" - < Dockerfile
tsm1rwdh

tsm1rwdh7#

您可以使用透明代理,如中所述:
https://jpetazzo.github.io/2014/06/17/transparent-squid-proxy-docker/

docker run --net host jpetazzo/squid-in-a-can
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 3129
okxuctiv

okxuctiv8#

我遇到过类似的问题,docker build无法从Amazon ECR上托管的注册表中拉取基本映像。我发现将代理配置添加到Docker Build命令行、Docker文件或我的shell没有任何区别。
对我有效的修复是更改Docker守护进程的环境。我使用的是CentOS盒,在该系统上有config目录/etc/systemd/system/docker.service.d和其中的http-proxy.conf文件。
我编辑了该文件以放置正确的代理配置,并重新启动了Docker守护进程,然后我的Docker构建开始工作。

[Service]
Environment="HTTP_PROXY=http://<hostname>:8080"
Environment="HTTPS_PROXY=http://<hostname>:8080"
Environment="NO_PROXY=<suffix>,<another suffix>"

相关问题