为node.js应用程序构builddocker镜像在代理之后失败

在docker构build过程中,我遇到了npm问题。 我背后的公司代理,并已阅读大约30篇文章(和stackoverflowpost)解决类似的问题。 但是,我仍然无法克服这一点。

我能够“npm安装”该项目,并获取所有必要的依赖关系以外的docker生成过程(但也使用代理),但不是在期间。

我到目前为止所尝试的:

  1. 直接使用代理(以及硬编码authentication数据),也通过CNTLM。 下面的描述是使用CNTLM的时候。
  2. 使用http repository,如下所示,使用strict_ssl false。

npm config set strict-ssl=false \

npm config set registry=http://registry.npmjs.org/ \

  1. 通过代理设置–build-arg,env和通过运行参数

  2. 从一个干净的git checkout(没有node_modules)开始,并在运行npm install之后

我正在尝试build立:

 $ sudo docker build --build-arg HTTP_PROXY=http://127.0.0.1:3128 --build-arg HTTPS_PROXY=http://127.0.0.1:3128 . 

输出

 Sending build context to Docker daemon 226.6 MB Step 1 : FROM node:argon ---> c74c117ed521 Step 2 : ENV http_proxy http://127.0.0.1:3128/ ---> Using cache ---> ad2e2df7429b Step 3 : ENV https_proxy http://127.0.0.1:3128/ ---> Using cache ---> 75fb2eb0bb22 Step 4 : RUN mkdir -p /usr/src/app ---> Using cache ---> ee79de37d6d7 Step 5 : WORKDIR /usr/src/app ---> Using cache ---> 404356f5def0 Step 6 : COPY package.json /usr/src/app/ ---> Using cache ---> a2ec47267628 Step 7 : RUN git config --global http.proxy http://127.0.0.1:3128/ ---> Running in 3cd5db8b1371 ---> 7353cd94b67a Removing intermediate container 3cd5db8b1371 Step 8 : RUN npm install ---> Running in 79ed0eb809d8 npm info it worked if it ends with ok npm info using npm@2.15.5 npm info using node@v4.4.6 npm info preinstall app npm info attempt registry request try #1 at 10:24:02 AM npm http request GET https://registry.npmjs.org/bufferutil npm info attempt registry request try #1 at 10:24:02 AM npm http request GET https://registry.npmjs.org/connect-mongo <snip> npm info retry will retry, error on last attempt: Error: tunneling socket could not be established, cause=connect ECONNREFUSED 127.0.0.1:3128 npm info retry will retry, error on last attempt: Error: tunneling socket could not be established, cause=connect ECONNREFUSED 127.0.0.1:3128 <snip> npm ERR! Linux 3.13.0-88-generic npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install" npm ERR! node v4.4.6 npm ERR! npm v2.15.5 npm ERR! code ECONNRESET npm ERR! network tunneling socket could not be established, cause=connect ECONNREFUSED 127.0.0.1:3128 npm ERR! network This is most likely not a problem with npm itself npm ERR! network and is related to network connectivity. npm ERR! network In most cases you are behind a proxy or have bad network settings. npm ERR! network npm ERR! network If you are behind a proxy, please make sure that the npm ERR! network 'proxy' config is set properly. See: 'npm help config' npm ERR! Please include the following file with any support request: npm ERR! /usr/src/app/npm-debug.log 

这是我的docker脚本

 FROM node:argon ENV http_proxy http://127.0.0.1:3128/ ENV https_proxy http://127.0.0.1:3128/ # Create app directory RUN mkdir -p /usr/src/app WORKDIR /usr/src/app # Install app dependencies COPY package.json /usr/src/app/ # setup proxies RUN git config --global http.proxy http://127.0.0.1:3128/ && \ npm config set strict-ssl=false \ npm config set registry=http://registry.npmjs.org/ \ npm config set proxy=http://127.0.0.1:3128/ && \ npm config set https-proxy=http://127.0.0.1:3128/ # Install dependencies for node.js RUN npm install # Bundle app source COPY . /usr/src/app EXPOSE 8080 CMD [ "npm", "start" ] 

使用--build-arg的方法是正确的:您只想在构buildDocker镜像时使用代理设置,而不是在Dockerfile内部使用它们,因此不会绑定到特定环境(您不需要ENV条目)。

你的问题是,你正在尝试使用docker build localhost cntlm代理,这是无效的,因为在构build时它将指向运行构build的docker容器,但实际上它应该指向你的主机提供的地址cntlm在dockernetworking。

为了做到这一点,你可以configuration你的cntlm在几个接口上侦听,然后激活网关模式,以便你可以在其他机器上使用它。 这样,当你的图像被构build时,你将把来自docker实例的请求发送给主机。

我的docker桥networking如下(我的主机获取作为地址docker0 172.17.0.1 ):

 $ docker network inspect bridge ... "Config": [ { "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" } ... 

在我的cntlm.conf

 ... Listen 127.0.0.1:3128 Listen 172.17.0.1:3128 ... Gateway yes Allow 127.0.0.1/32 Allow 172.17.0.0/16 Deny 0/0 ... 

有了这个configuration,cntlm将监听localhost和docker bridgenetworking,只允许从任何docker容器进行远程连接。

然后在使用npm构build图像时使用代理设置:

 $ docker build --build-arg=HTTP_PROXY=http://172.17.0.1:3128 --build-arg=HTTPS_PROXY=http://172.17.0.1:3128 . 

我希望有所帮助,我知道在企业networking中做这一切真的是一个皮塔!

编辑18-aug-2016

我今天发现的是,如果你使用v2格式的docker-compose文件,启动compose文件将为你的容器创build一个新的networking。 这意味着您需要相应地调整您的cntlm文件以接受来自这些新范围的连接。

例如,我的一个撰写文件刚创build了172.19.0.0/16下的一个networking,但是我的cntlm config只允许来自172.17.0.0/16连接。 如果遇到连接问题,请检查您的系统日志以确定问题。

https://docs.docker.com/compose/networking/