web-dev-qa-db-fra.com

Comment construire des images Docker avec Dockerfile derrière HTTP_PROXY par Jenkins?

La création d'images Docker fonctionne sur un bureau sans problème. L'installation des dépendances Node.js NPM fonctionne comme d'habitude. Cependant, lorsque vous utilisez un serveur d'intégration continue tel que Jenkins qui est hébergé derrière un proxy d'entreprise, les images Docker de construction échouent.

Dépendances Node.js NPM

Lors de la construction des paquets Node.js, la commande npm install échoue lorsqu'il ne peut pas se connecter à GIT lors du clonage des dépendances GIT.

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 '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

Images Java Maven, Ruby, Go Docker avec dépendances

La même chose se produit lors de la construction de conteneurs Java, Ruby ou Go, où les dépendances sont situées dans les serveurs de référentiel de votre serveur proxy d'entreprise.

Sachant que vous pouvez configurer Docker avec la variable d'environnement HTTP_PROXY, comment configurer correctement Docker pour créer correctement des images dans des environnements CI?

20
Marcello de Sales

Remarque: Docker 1.9 peut-être aide à résoudre ce problème:

  • " Problème 14634 ": Générateur - Argument au moment de la construction passant (par exemple, HTTP_PROXY)
  • " PR 15182 ": Prise en charge du passage des variables de construction dans le contexte de construction

Utilisation (proposée):

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

Je devais faire

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

$http_proxy et $no_proxy ont été définis dans mon bashrc. J'ai utilisé les deux HTTP_PROXY et http_proxy car différents utilitaires vérifieront différentes variables (curl vérifie les deux, wget vérifie uniquement les minuscules, etc.). Réglage ENV http_proxy http://proxy.mycompany.com:80 n'a pas aidé car j'essayais d'utiliser ces variables au moment de la construction, pas au moment de l'exécution.

11
jeremysprofile

Docker Daemon HTTP Proxy

De nombreuses documentations sont disponibles sur la configuration de la variable d'environnement HTTP_PROXY pour le démon Docker. La variable d'environnement n'est disponible que lorsque exécution de conteneurs, donc cela ne nous aidera pas ici.

Solution dans Dockerfile

Bien que la configuration de la variable d'environnement HTTP_ENV ou http_env dans le Dockerfile puisse aider, cela n'aide pas non plus notre cause.

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

La raison en est que chaque service spécifique n'honore que les paramètres du proxy HTTP d'une manière différente. La façon dont j'ai pu résoudre est ci-dessous.

  • NPM: NPM nécessite la configuration de la variable HTTP_PROXY à l'aide d'une commande CLI.
  • GIT: GIT nécessite également de configurer la variable HTTP_PROXY à l'aide d'une commande CLI.
  • MAVEN: La commande MVN nécessite la configuration de HTTP_PROXY en tant que fichier XML dans le répertoire de l'utilisateur à ~/.m2/settings.xml. Pour Docker, vous pouvez l'ajouter au répertoire "/root/.m2/settings.xml" de la racine (dangereux, développement uniquement), ou au répertoire personnel de l'utilisateur du Dockerfile.

Par exemple, en exécutant une application à l'aide de Dockerfile, je peux créer une image à l'aide du Dockerfile suivant:

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

Notez que j'ai configuré GIT et NPM à l'aide de leur commande CLI pour prendre explicitement les paramètres du proxy avant d'exécuter la commande d'installation NPM. De cette façon, les dépendances NPM et GIT seront automatiquement récupérées et clonées, respectivement.

Le résultat de la construction d'une image avec ce Dockerfile fonctionne comme prévu:

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

Cela a bien fonctionné comme prévu et vous pouvez avoir un environnement CI/CD derrière un proxy http pour reconstruire des images basées sur ce Dockerfile.

11
Marcello de Sales

Nous faisons ...

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

et à la fin du dockerfile ...

ENV http_proxy ""
ENV https_proxy ""

Ceci, pour l'instant (jusqu'à ce que le docker introduise les vars de build env), permet aux vars proxy d'être utilisés pour la construction sans les exposer publiquement

3
danday74

À partir de Docker 17.07, vous pouvez également utiliser le fichier de configuration du client Docker pour fournir la configuration proxy de manière centralisée:

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

2
desolat

Vous pouvez utiliser un proxy transparent, comme décrit dans:

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

J'ai eu un problème lorsque le réseau d'entreprise ne permettait pas de télécharger et de configurer l'image docker, donc il a donné des informations de proxy http. lors de l'exécution de la génération d'image docker, j'ai transmis la variable et cela a fonctionné sans aucun problème.

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