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.
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
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?
Remarque: Docker 1.9 peut-être aide à résoudre ce problème:
HTTP_PROXY
)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
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
où $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.
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.
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.
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.
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
À 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
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
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