Сбой создания образа докера для приложения node.js за прокси
У меня проблема с npm во время сборки докера. Я нахожусь за корпоративным прокси и прочитал около 30 статей (и сообщений от stackru), посвященных аналогичным проблемам. Однако я все еще не смог преодолеть это.
Я могу "npm установить" проект и получить все необходимые зависимости вне процесса сборки докера (но также с использованием прокси), но не во время.
Что я уже пробовал:
- Использование прокси напрямую (вместе с жестко закодированными данными аутентификации), а также через CNTLM. Описание ниже - при использовании CNTLM.
- Использование http-репозитория, как показано ниже, с false.
npm config set strict-ssl=false \
npm config set registry=http://registry.npmjs.org/ \
Передача настроек прокси как --build-arg, env и через параметр RUN
Начиная с чистой проверки git (без node_modules) и после запуска установки npm
Я пытаюсь построить с:
$ sudo docker build --build-arg HTTP_PROXY=http://127.0.0.1:3128 --build-arg HTTPS_PROXY=http://127.0.0.1:3128 .
Выход
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 npm@2.15.5
npm info using node@v4.4.6
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
Это мой докер скрипт
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" ]
2 ответа
Подход с использованием --build-arg
является правильным: вы хотите использовать настройки прокси только при создании образа Docker, а не при их наличии внутри файла Docker, чтобы он не был привязан к конкретной среде (вам не нужны записи ENV на нем).
Ваша проблема в том, что вы пытаетесь использовать в качестве прокси-сервера cntlm внутри сборки Docker localhost
, что недопустимо, поскольку во время сборки он указывает на контейнер докера, на котором выполняется сборка, но на самом деле он должен указывать на адрес вашего хоста, предлагающего cntlm в сети докера.
Чтобы это работало, вы можете настроить ваш cntlm на прослушивание в нескольких интерфейсах, а затем активировать режим шлюза, чтобы вы могли использовать его с других машин. Таким образом, когда ваш образ создается, вы будете отправлять запросы от экземпляра докера на хост.
Моя сеть Docker Bridge выглядит следующим образом (мой хост получает в качестве адреса в docker0
172.17.0.1
):
$ docker network inspect bridge
...
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
...
В моем 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
...
С помощью этой конфигурации cntlm будет прослушивать как localhost, так и сеть моста Docker, разрешая только удаленные подключения из любого контейнера Docker.
Затем вы используете настройки прокси при создании изображения с помощью npm:
$ docker build --build-arg=HTTP_PROXY=http://172.17.0.1:3128 --build-arg=HTTPS_PROXY=http://172.17.0.1:3128 .
Я надеюсь, что это помогает, я знаю, что делать все это в корпоративных сетях действительно лакомый кусочек!
РЕДАКТИРОВАТЬ 18 августа 2016
Сегодня я обнаружил, что если вы используете файлы docker-compose в формате v2, запуск файла compose создаст новую сеть для ваших контейнеров. Это означает, что вам необходимо соответствующим образом адаптировать файл cntlm, чтобы принимать соединения из этих новых диапазонов.
Например, один из моих файлов создания только что создал сеть под 172.19.0.0/16
, но мой конфиг cntlm разрешены только подключения от 172.17.0.0/16
, Проверьте системный журнал, чтобы определить проблему, если у вас возникли проблемы с подключением.
Была точно такая же ситуация! Просто установкаproxy
иhttp-proxy
в.npmrc
как это сработало для меня.
proxy = http://your-company-proxy
https-proxy = http://your-company-proxy
Может также работать, если вы бежите
RUN npm config set proxy http://your-company-proxy
RUN npm config set https-proxy http://your-company-proxy
в вашем Dockerfile.