一尘不染

为node.js应用构建docker镜像在代理后失败

docker

我在docker构建期间遇到了npm问题。我是公司代理的幕后推手,已经阅读了约30篇文章(和stackoverflow帖子),解决了类似问题。但是,我仍然无法克服这一点。

我能够“ npm安装”项目,并在docker构建过程之外(但也使用代理)获取所有必需的依赖关系,但不能在此期间获取。

到目前为止我尝试过的是:

  1. 直接使用代理(以及经过硬编码的身份验证数据),也可以通过CNTLM使用。下面的描述是使用CNTLM时的。
  2. 如下所示使用http存储库,strict_ssl为false。

npm config set strict-ssl=false \

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

  1. 通过–build-arg,env并通过RUN参数传递代理设置

  2. 从干净的git checkout开始(没有node_modules),然后运行npm install

我试图建立:

$ 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" ]

阅读 666

收藏
2020-06-17

共1个答案

一尘不染

使用的方法--build- arg是正确的:您只想在构建Docker映像时使用代理设置,而不是将它们包含在Dockerfile中,这样它就不会绑定到特定的环境(您不需要在其上添加ENV条目)

您的问题是您试图在docker
build中用作cntlm代理localhost,这是无效的,因为在构建时,它将指向运行构建的docker容器,但实际上应指向在其中提供cntlm的主机的地址。码头工人网络。

为了使它起作用,您可以将cntlm配置为侦听多个接口,然后激活网关模式,以便可以从其他计算机上使用它。这样,在构建映像时,您会将请求从Docker实例发送到主机。

我的Docker桥接网络如下(我的主机以的地址获取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
...

使用此配置,cntlm将侦听localhost和docker bridge网络,仅允许来自任何docker容器的远程连接。

然后在使用npm构建映像时使用代理设置:

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

我希望能有所帮助,我知道在企业网络中实现所有这些确实是皮塔饼!

编辑2016年8月18日

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

举例来说,我的一个compose文件刚刚在下创建了一个网络172.19.0.0/16,但是我的cntlm配置只允许来自的连接172.17.0.0/16。如果遇到连接问题,请检查系统日志以识别问题。

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

2020-06-17