web-dev-qa-db-de.com

Wie erstelle ich Docker Images mit Dockerfile hinter HTTP_PROXY von Jenkins?

Das Erstellen von Docker-Images funktioniert problemlos auf einem Desktop. Das Installieren der NPM-Abhängigkeiten von Node.j funktioniert wie gewohnt. Wenn Sie jedoch einen Continuous Integration Server wie Jenkins verwenden, der sich hinter einem Unternehmensproxy befindet, schlägt die Erstellung von Docker Images fehl.

NPM-Abhängigkeiten von Node.js

Während der Erstellung von Node.js-Paketen schlägt der Befehl npm install fehl, wenn beim Klonen von GIT-Abhängigkeiten keine Verbindung zu GIT hergestellt werden kann.

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 [email protected] No README data
npm WARN package.json Dependency 'async-cache' exists in both dependencies and devDependencies, using '[email protected]^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 Images mit Abhängigkeiten

Dasselbe gilt für die Erstellung von Java-, Ruby oder Go-Containern, bei denen sich Abhängigkeiten auf den Repository-Servern Ihres Unternehmensproxyservers befinden.

Wenn Sie wissen, dass Sie Docker mit der Umgebungsvariablen HTTP_PROXY konfigurieren können, wie Sie Docker ordnungsgemäß konfigurieren, um Images in CI-Umgebungen ordnungsgemäß zu erstellen?

20

Hinweis: Docker 1.9 könnte hilft bei der Lösung dieses Problems:

  • " Problem 14634 ": Builder - Übergabe des Build-Zeit-Arguments (z. B. HTTP_PROXY)
  • " PR 15182 ": Unterstützung für die Übergabe von Build-Zeit-Variablen im Build-Kontext

Verwendung (vorgeschlagen):

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
36
VonC

Ich musste es tun

docker build --no-cache --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

wo $http_proxy und $no_proxy wurden in meinem Baschromat festgelegt. Ich habe beide HTTP_PROXY und http_proxy weil verschiedene Dienstprogramme verschiedene Variablen prüfen (curl prüft beide, wget prüft nur die Kleinbuchstaben, usw.). Einstellung ENV http_proxy http://proxy.mycompany.com:80 hat nicht geholfen, da ich versucht habe, diese Variablen zur Erstellungszeit und nicht zur Laufzeit zu verwenden.

11
jeremysprofile

Docker Daemon HTTP Proxy

Zum Einrichten der Umgebungsvariablen HTTP_PROXY für den Docker-Daemon ist eine Vielzahl von Dokumentationen verfügbar. Die Umgebungsvariable ist nur verfügbar, wenn Container ausführen, daher hilft sie uns hier nicht weiter.

Lösung in Dockerfile

Das Einrichten der Umgebungsvariablen HTTP_ENV oder http_env in der Docker-Datei kann zwar hilfreich sein, hilft aber auch unserer Sache nicht.

ENV http_proxy http://proxy.mycompany.com:80

Der Grund dafür ist, dass jeder bestimmte Dienst die HTTP-Proxy-Einstellungen nur auf andere Weise berücksichtigt. Der Weg, den ich lösen könnte, ist unten.

  • NPM: Für NPM muss die Variable HTTP_PROXY mit einem CLI-Befehl eingerichtet werden.
  • GIT: Für GIT muss die Variable HTTP_PROXY auch mit einem CLI-Befehl eingerichtet werden.
  • MAVEN: Für den MVN-Befehl muss HTTP_PROXY als XML-Datei im Benutzerverzeichnis unter ~/.m2/settings.xml eingerichtet werden. Für Docker können Sie es zum Stammverzeichnis "/root/.m2/settings.xml" (unsicher, nur für Entwickler) oder zum Basisverzeichnis des Docker-Benutzers hinzufügen.

Wenn Sie beispielsweise eine Anwendung mit Dockerfile ausführen, kann ich ein Image mit der folgenden Dockerfile erstellen:

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

Beachten Sie, dass ich sowohl GIT als auch NPM mithilfe ihres CLI-Befehls so konfiguriert habe, dass die Proxy-Einstellungen explizit übernommen werden, bevor der NPM-Installationsbefehl ausgeführt wird. Auf diese Weise werden sowohl NPM- als auch GIT-Abhängigkeiten automatisch abgerufen und geklont.

Das Ergebnis der Erstellung eines Images mit diesem Dockerfile funktioniert wie erwartet:

[[email protected] 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 [email protected] No README data
npm WARN package.json Dependency 'async-cache' exists in both dependencies and devDependencies, using '[email protected]^0.1.5' from dependencies
npm WARN deprecated [email protected]: Please update to the latest version.

> [email protected] install /usr/src/app/node_modules/gulp/node_modules/v8flags
> node fetch.js


> [email protected] 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 [email protected]: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})

> [email protected] 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!

> [email protected] install /usr/src/app/node_modules/npm-typeahead/node_modules/restify/node_modules/dtrace-provider
> scripts/install.js

npm WARN engine [email protected]: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})
npm WARN engine [email protected]: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})
npm WARN engine [email protected]: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})
npm WARN engine [email protected]: wanted: {"node":"0.8.x"} (current: {"node":"0.10.33","npm":"2.1.11"})
npm WARN cannot run in wd [email protected] gulp build (wd=/usr/src/app)
[email protected] node_modules/newww-metrics

[email protected] node_modules/murmurhash

[email protected] node_modules/npm-humans

[email protected] node_modules/leven

[email protected] node_modules/chunk

[email protected] node_modules/npm-expansions

[email protected] node_modules/similarity

[email protected] node_modules/truncate

Dies funktionierte ordnungsgemäß wie erwartet und Sie können eine CI/CD-Umgebung hinter einem http-Proxy haben, um Images basierend auf dieser Docker-Datei neu zu erstellen.

11

Wir machen ...

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

und am Ende der Dockerfile ...

ENV http_proxy ""
ENV https_proxy ""

Auf diese Weise können (bis Docker Build-Env-Vars einführt) die Proxy-Vars für Builds verwendet werden, ohne sie öffentlich zugänglich zu machen

3
danday74

Ab Docker 17.07 können Sie alternativ die Docker Client-Konfigurationsdatei verwenden, um die Proxy-Konfiguration zentral bereitzustellen:

https://docs.docker.com/network/proxy/#configure-the-docker-client

2
desolat

Sie können einen transparenten Proxy wie folgt verwenden:

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
0
Atila Romero

Ich hatte ein Problem, als das Unternehmensnetzwerk das Herunterladen und Einrichten des Docker-Image nicht zuließ und daher keine http-Proxy-Informationen gab. Beim Ausführen von Docker Image Build habe ich die Variable übergeben und es funktionierte ohne Probleme.

  docker build  --build-arg http_proxy="http://userid:[email protected]:8080" - < Dockerfile
0