2016-06-29 12 views
1

Ich habe ein Problem mit Npm während des Docker-Build. Ich bin hinter einem Corporate Proxy und habe etwa 30 Artikel (und Stackoverflow-Beiträge) gelesen, die ähnliche Probleme ansprechen. Das konnte ich jedoch noch nicht überwinden.Erstellen eines Docker-Image für eine node.js-App schlägt hinter Proxy fehl

Ich bin in der Lage, "npm" das Projekt zu installieren und alle notwendigen Abhängigkeiten außerhalb des Docker-Build-Prozesses (aber auch mit dem Proxy) zu holen, aber nicht während.

Was ich bisher versucht:

  1. den Proxy direkt (zusammen mit fest codierten Daten Auth) und auch über cntlm. Die folgende Beschreibung bezieht sich auf CNTLM.
  2. Verwenden Sie das HTTP-Repository wie unten dargestellt mit strict_ssl false.

npm config set strict-ssl=false \

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

  1. die Proxy-Einstellungen Passing als --build argument, env und über den RUN param

  2. Beginnend mit eine saubere git checkout (ohne node_module) und nach läuft die npm installieren

ich mit aufzubauen versuchen:

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

Der Ausgang

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 [email protected] 
npm info using [email protected] 
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 

Das ist mein Docker Skript

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

Antwort

3

Der Ansatz Verwenden Sie --build-arg ist die richtige: Sie möchten nur die Proxy-Einstellungen beim Erstellen des Docker-Image und nicht in der Docker-Datei, so dass es nicht an eine bestimmte Umgebung gebunden ist (Sie brauchen nicht die ENV-Einträge darauf).

Ihr Problem ist, dass Sie versuchen, als Cntlm-Proxy innerhalb der Docker Build localhost zu verwenden, die nicht gültig ist, da zur Build-Zeit auf den Docker-Container, der den Build ausgeführt wird, zeigen, aber es sollte tatsächlich auf die Adresse zeigen Ihr Host bietet cntlm im Andocknetzwerk an.

Um dies zu erledigen, können Sie Ihren cntlm so konfigurieren, dass er in mehreren Schnittstellen zuhört und dann den Gateway-Modus aktiviert, damit Sie ihn von anderen Rechnern aus nutzen können. Wenn Sie Ihr Image erstellen, senden Sie auf diese Weise die Anforderungen von der Docker-Instanz an den Host.

Meine Docker Brücke Netzwerk wie folgt ist (mein Gastgeber bekommt als Adresse in docker0172.17.0.1):

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

In meinem 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 
... 

Mit dieser Konfiguration wird cntlm sowohl localhost hören und das Andockbrücken-Netzwerk, das nur Remote-Verbindungen von jedem Andock-Container zulässt.

Sie dann die Proxy-Einstellungen verwenden, wenn Sie Ihr Bild mit npm Aufbau:

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

Ich hoffe, das hilft, weiß ich, dass in Unternehmensnetzwerken all dies machen, ist wirklich ein Fladen!

EDIT 18-August-2016

Etwas, das ich heute entdeckt ist, wenn Sie Docker-compose Dateien mit v2-Format verwenden, wird die Datei compose Start für Ihre Container ein neues Netzwerk erstellen. Dies bedeutet, dass Sie Ihre cntlm-Datei entsprechend anpassen müssen, um Verbindungen von diesen neuen Bereichen zu akzeptieren.

Als Beispiel hat eine meiner Compose-Dateien gerade ein Netzwerk unter 172.19.0.0/16 erstellt, aber meine cntlm-Konfiguration erlaubte nur Verbindungen von 172.17.0.0/16. Überprüfen Sie Ihr Syslog, um das Problem zu identifizieren, wenn Verbindungsprobleme auftreten.

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

+0

Vielen Dank! Das hat den Trick gemacht. –