Подтвердить что ты не робот

Как создать Docker Images с Dockerfile за HTTP_PROXY от Jenkins?

Изображения Building Docker работают на рабочем столе без проблем. Установка зависимостей NPM Node.js работает как обычно. Однако при использовании сервера непрерывной интеграции, такого как Jenkins, который размещен за корпоративным прокси-сервером, сборка Docker Images выходит из строя.

Node.js Зависимости NPM

При построении Node.js pacakges команда npm install терпит неудачу, если она не может подключиться к GIT при клонировании зависимостей 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 '[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 Изображения с зависимостями

То же самое происходит при создании контейнеров Java, Ruby или Go, где зависимости находятся на серверах репозитория на вашем корпоративном прокси-сервере.

Зная, что вы можете настроить Docker с переменной среды HTTP_PROXY, как правильно настроить Docker для правильной сборки изображений в средах CI?

4b9b3361

Ответ 1

Примечание. Docker 1.9 может помочь решить эту проблему:

  • "Проблема 14634": Builder - передача аргумента Build-time (например, HTTP_PROXY)
  • "PR 15182": Поддержка передачи переменных времени сборки в контексте компоновки

Использование (предлагается):

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 description" foo
USER $foo
MARK

Ответ 2

HTTP-прокси Docker Daemon

Имеется много документации о настройке переменной среды HTTP_PROXY для демона Docker. Переменная среды доступна только в работающих контейнерах, поэтому нам это не поможет.

Решение в файле Dockerfile

Хотя настройка переменной окружения HTTP_ENV или http_env в файле Docker может помочь, это также не помогает нашей причине.

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

Причина в том, что каждая конкретная служба только отличает настройку HTTP-прокси по-другому. То, как я могу решить, ниже.

  • NPM: NPM требует настройки переменной HTTP_PROXY с помощью команды CLI.
  • GIT: GIT требуется настройка переменной HTTP_PROXY с помощью команды CLI.
  • MAVEN: команда MVN требует настройки HTTP_PROXY в качестве файла XML в каталоге пользователя в ~.m2/settings.xml. Для Docker вы можете добавить его в корневой каталог "/root/.m2/settings.xml" (небезопасно, только для разработки) или в домашний каталог пользователя Dockerfile.

Например, запустив приложение с использованием Dockerfile, я могу создать образ, используя следующий файл Docker:

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

Обратите внимание, что я настроил оба GIT и NPM, используя команду CLI, чтобы явно выполнить настройки прокси-сервера перед запуском команды установки NPM. Таким образом, зависимости между NPM и GIT будут автоматически восстановлены и клонированы соответственно.

Результат создания изображения с этим файлом Docker работает как ожидалось:

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

Это правильно работало, как ожидалось, и вы можете иметь среду CI/CD за HTTP-прокси для восстановления изображений на основе этого файла Docker.

Ответ 3

Я должен был сделать

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 и $no_proxy были установлены в моем bashrc. Я использовал HTTP_PROXY и http_proxy, потому что разные утилиты будут проверять разные переменные (curl проверяет обе, wget проверяет только строчные и т.д.). Установка ENV http_proxy http://proxy.mycompany.com:80 не помогла, так как я пытался использовать эти переменные во время сборки, а не во время выполнения.

Ответ 4

Мы делаем...

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

и в конце файла docker...

ENV http_proxy ""
ENV https_proxy ""

Это, пока (пока докер не вводит build env vars), разрешает использование прокси-варов для сборки без публичной демонстрации их

Ответ 6

У меня была проблема, когда корпоративная сеть не позволяла загружать и настраивать образ докера, поэтому n/w предоставил информацию http прокси. при запуске сборки образа докера я передал переменную, и она работала без проблем.

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