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

Как вы запускаете `apt-get` в файле docker за прокси-сервером?

Я запускаю виртуальную машину (Ubuntu 13.10) с докере (версия 0.8.1, build a1598d1). Я пытаюсь создать образ с файлом docker. Во-первых, я хочу обновить пакеты (используя код ниже - прокси-сервер запущен), но apt-get с ошибкой: Could not resolve 'archive.ubuntu.com'.

FROM ubuntu:13.10
ENV HTTP_PROXY <HTTP_PROXY>
ENV HTTPS_PROXY <HTTPS_PROXY>
RUN export http_proxy=$HTTP_PROXY
RUN export https_proxy=$HTTPS_PROXY
RUN apt-get update && apt-get upgrade

В хост-системе я также запускаю следующее:

sudo HTTP_PROXY=http://<PROXY_DETAILS>/ docker -d &

Хост может запускать apt-get без проблем.

Как я могу изменить файл docker, чтобы он мог доходить до серверов ubuntu из контейнера?

Обновление

Я запускал код в CentOS (меняя FROM ubuntu:13.10 на FROM centos), и он работал нормально. Кажется, проблема с Ubuntu.

4b9b3361

Ответ 1

UPDATE

У вас неправильная капитализация переменных окружения в ENV. Правильным является http_proxy. Ваш пример должен быть:

FROM ubuntu:13.10
ENV http_proxy <HTTP_PROXY>
ENV https_proxy <HTTPS_PROXY>
RUN apt-get update && apt-get upgrade

или

FROM centos
ENV http_proxy <HTTP_PROXY>
ENV https_proxy <HTTPS_PROXY>
RUN yum update 

Все переменные, указанные в ENV, добавляются к каждой команде RUN. Каждая команда RUN выполняется в собственном контейнере/среде, поэтому она не наследует переменные от предыдущих команд RUN!

Примечание. Нет необходимости звонить демону docker с прокси-сервером, чтобы это работало, хотя, если вы хотите вытащить изображения и т.д., вам также нужно установить прокси-сервер для докеров-деамонов. Вы можете установить прокси для демона в /etc/default/docker в Ubuntu (это не влияет на настройки контейнера).


Кроме того, это может произойти в случае, если вы запустите свой прокси на хосте (т.е. localhost, 127.0.0.1). Локальный хост на хосте отличается от localhost в контейнере. В этом случае вам нужно использовать другой IP-адрес (например, 172.17.42.1), чтобы связать ваш прокси-сервер или привязать его к 0.0.0.0, вы можете использовать 172.17.42.1 вместо 127.0.0.1 для подключения из контейнера во время docker build.

Вы также можете найти здесь пример: Как быстро восстановить файл докеров с помощью кеша?

Ответ 2

Обновлено 10/10/2018

С новой функцией в опции докера --config вам больше не нужно устанавливать Proxy в Dockerfile. Вы можете иметь один и тот же Dockerfile для использования в корпоративной среде.

--config string      Location of client config files (default "~/.docker")

или переменная окружения DOCKER_CONFIG

'DOCKER_CONFIG' The location of your client configuration files.

$ export DOCKER_CONFIG=~/.docker

https://docs.docker.com/engine/reference/commandline/cli/

https://docs.docker.com/network/proxy/

Я рекомендую установить прокси с httpProxy, httpsProxy, ftpProxy и noProxy.

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://127.0.0.1:3001",
     "httpsProxy": "http://127.0.0.1:3001",
     "ftpProxy": "http://127.0.0.1:3001",
     "noProxy": "*.test.example.com,.example2.com"
   }
 }
}

При необходимости ~/.docker/config.json IP-адрес и порт прокси и сохраните в ~/.docker/config.json

После того, как вы настроите его правильно, вы можете запустить сборку Docker и запустить Docker как обычно.

$ docker build -t demo . 

$ docker run -ti --rm demo env|grep -ri proxy
(standard input):http_proxy=http://127.0.0.1:3001
(standard input):HTTPS_PROXY=http://127.0.0.1:3001
(standard input):https_proxy=http://127.0.0.1:3001
(standard input):NO_PROXY=*.test.example.com,.example2.com
(standard input):no_proxy=*.test.example.com,.example2.com
(standard input):FTP_PROXY=http://127.0.0.1:3001
(standard input):ftp_proxy=http://127.0.0.1:3001
(standard input):HTTP_PROXY=http://127.0.0.1:3001

Старый ответ

Ниже настройка в Dockerfile у меня работает. Я тестировал в CoreOS, Vagrant и boot2docker. Предположим, что порт прокси 3128

В Centos:

ENV http_proxy=ip:3128 
ENV https_proxy=ip:3128

В Ubuntu:

ENV http_proxy 'http://ip:3128'
ENV https_proxy 'http://ip:3128'

Будьте осторожны с форматом, у некоторых в нем есть http, у некоторых нет, у некоторых - одинарная квота. если IP-адрес 192.168.0.193, то настройка будет:

В Centos:

ENV http_proxy=192.168.0.193:3128 
ENV https_proxy=192.168.0.193:3128

В Ubuntu:

ENV http_proxy 'http://192.168.0.193:3128'
ENV https_proxy 'http://192.168.0.193:3128'

Если вам нужно установить прокси в Coreos, например, чтобы вытащить изображение

cat /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=http://192.168.0.193:3128"

Ответ 3

Вы можете использовать опцию --build-arg, если вы хотите построить с помощью файла Docker.

Из ссылки https://github.com/docker/docker/issues/14634 см. раздел "Построение с помощью --build-arg с несколькими HTTP_PROXY":

[[email protected] java]# docker build 
  --build-arg https_proxy=$HTTP_PROXY --build-arg http_proxy=$HTTP_PROXY 
  --build-arg HTTP_PROXY=$HTTP_PROXY --build-arg HTTPS_PROXY=$HTTP_PROXY 
  --build-arg NO_PROXY=$NO_PROXY  --build-arg no_proxy=$NO_PROXY -t java .

Примечание: В своей собственной системе убедитесь, что вы задали переменные среды HTTP_PROXY и NO_PROXY.

Ответ 4

перед любой командой apt-get в вашем файле Docker вы должны поместить эту строку

COPY apt.conf /etc/apt/apt.conf

Не забудьте создать apt.conf в той же папке, где у вас есть файл Docker, содержимое файла apt.conf должно быть таким:

Acquire::socks::proxy "socks://YOUR-PROXY-IP:PORT/";
Acquire::http::proxy "http://YOUR-PROXY-IP:PORT/";
Acquire::https::proxy "http://YOUR-PROXY-IP:PORT/";

если вы используете имя пользователя и пароль для подключения к прокси-серверу, тогда apt.conf должен выглядеть следующим образом:

Acquire::socks::proxy "socks://USERNAME:[email protected]:PORT/";
Acquire::http::proxy "http://USERNAME:[email protected]:PORT/";
Acquire::https::proxy "http://USERNAME:[email protected]:PORT/";

например:

Acquire::https::proxy "http://foo:[email protected]:8080/";

Если foo - это имя пользователя, а bar - пароль.

Ответ 5

Использовать -build-arg в нижней переменной среды:

docker build --build-arg http_proxy=http://proxy:port/ --build-arg https_proxy=http://proxy:port/ --build-arg ftp_proxy=http://proxy:port --build-arg no_proxy=localhost,127.0.0.1,company.com -q=false .

Ответ 6

У меня была та же проблема и нашлось другое небольшое обходное решение: У меня есть создатель script, который добавляется в среду сборки docker. В script я задается переменная среды, зависящая от проверки ping:

Dockerfile:

ADD script.sh /tmp/script.sh
RUN /tmp/script.sh

script.sh:

if ping -c 1 ix.de ; then
    echo "direct internet doing nothing"
else
    echo "proxy environment detected setting proxy"
    export http_proxy=<proxy address>
fi

это все еще немного грубо, но работало для меня

Ответ 7

Как было предложено другими ответами, --build-arg может быть решением. В моем случае мне пришлось добавить --network=host в дополнение к параметрам --build-arg.

docker build -t <TARGET> --build-arg http_proxy=http://<IP:PORT> --build-arg https_proxy=http://<IP:PORT> --network=host .

Ответ 8

Если вы правильно настроили прокси-серверы и до сих пор не можете попасть в Интернет, это может быть разрешение DNS. Проверьте /etc/resolve.conf на виртуальной машине Ubuntu хоста. Если он содержит nameserver 127.0.1.1, это неверно.

Запустите эти команды на узле Ubuntu VM, чтобы исправить ее:

sudo vi /etc/NetworkManager/NetworkManager.conf
# Comment out the line `dns=dnsmasq` with a `#`

# restart the network manager service
sudo systemctl restart network-manager

cat /etc/resolv.conf

Теперь /etc/resolv.conf должно иметь допустимое значение для сервера имен, которое будет скопировано контейнерами докеров.

Ответ 9

Мы делаем...

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), разрешает использование prov env vars для сборки только, не подвергая их

Альтернативой решению НЕ является создание ваших изображений локально за прокси-сервером, но чтобы докеры могли создавать ваши изображения для вас, используя "автоматические сборки" докеров. Поскольку докер не создает изображения за вашим прокси, проблема решена. Пример автоматической сборки доступен в...

https://github.com/danday74/docker-nginx-lua (репозиторий GITHUB)

https://registry.hub.docker.com/u/danday74/nginx-lua (репозиторий DOCKER, который просматривает репозиторий github, используя автоматическую сборку и делая докер, нажимает на мастер github отделение)

Ответ 10

и если вы хотите установить прокси для wget, вы должны поместить эту строку в свой файл Dockerfile

ENV http_proxy YOUR-PROXY-IP:PORT/
ENV https_proxy YOUR-PROXY-IP:PORT/
ENV all_proxy YOUR-PROXY-IP:PORT/

Ответ 11

Как отметил Тим Поттер, установка прокси-сервера в dockerfile ужасна. При создании образа вы добавляете прокси для своей корпоративной сети, но вы можете развертывать в облаке или DMZ, где нет необходимости в прокси или прокси-сервер отличается.

Кроме того, вы не можете делиться своим изображением с другими людьми, не входящими в корпоративную сеть.

Ответ 12

Небольшая альтернатива ответу, предоставленному @Reza Farshi (который лучше работает в моем случае), - записать настройки прокси в /etc/apt/apt.conf используя echo через Dockerfile, например:

FROM ubuntu:16.04

RUN echo "Acquire::http::proxy \"$HTTP_PROXY\";\nAcquire::https::proxy \"$HTTPS_PROXY\";" > /etc/apt/apt.conf

# Test that we can now retrieve packages via 'apt-get'
RUN apt-get update

Преимущество этого подхода заключается в том, что прокси-адреса могут передаваться динамически во время создания образа, а не копировать файл настроек с хоста.

например

docker build --build-arg HTTP_PROXY=http://<host>:<port> --build-arg HTTPS_PROXY=http://<host>:<port>.

в соответствии с докером сборки документов.