Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумНастройка и подключение

Docker: переменные не доезжают внутрь контейнера

byteflow
byteflow
Новичок
сообщений 225
с фев, второй сезон
15 июля, 14:42первое сообщение

На хосте всё настроено, env | grep -i proxy показывает что надо, curl с хоста ходит. Собираю образ, запускаю контейнер, и внутри пусто: скрипт лезет напрямую и висит.

$ docker run --rm moy-obraz env | grep -i proxy
$

Пробовал прописать в Dockerfile через ENV, при сборке помогло, при запуске снова мимо. Чувствую, что путаю два разных момента, но где именно, не вижу.

stackfix
stackfix
Участник
сообщений 495
с окт
22 декабря, 17:59#2

Их и правда два, и они не связаны.

Сборка идёт в своём окружении: там работают ARG и то, что вы передали флагом при вызове сборки. Запуск идёт в другом: там живут ENV из образа и то, что передано при старте контейнера. Хостовое окружение не наследуется ни туда, ни туда, демон вообще запускается отдельно от вашей консоли.

Для сборки:

docker build \
  --build-arg http_proxy=http://login:pass@193.0.2.44:8000 \
  --build-arg https_proxy=http://login:pass@193.0.2.44:8000 \
  -t moy-obraz .

Для запуска:

docker run --rm \
  -e HTTP_PROXY=http://login:pass@193.0.2.44:8000 \
  -e HTTPS_PROXY=http://login:pass@193.0.2.44:8000 \
  -e NO_PROXY=localhost,127.0.0.1,registry.local \
  moy-obraz
пишу скрипты, чтобы не писать скрипты
byteflow
byteflow
Новичок
сообщений 225
с фев, второй сезон
1 мая, 08:16#3

Ага, то есть ENV в Dockerfile влияет только на запуск, а сборка про него ничего не знает?

stackfix
stackfix
Участник
сообщений 495
с окт
8 октября, 11:33#4

Наоборот: ENV работает и там, и там, он записан в образ. ARG живёт только во время сборки и в готовый образ не попадает.

Пароль в ENV вписывать не советую, он останется в слоях образа и в docker history. Передавайте при запуске.

пишу скрипты, чтобы не писать скрипты
gremlin_dv
gremlin_dv
Знаток
сообщений 1840
с мар
15 марта, 14:50#5

Отдельно про третьи грабли, они догоняют почти каждого, кто дошёл до этого места.

Внутри контейнера localhost означает сам контейнер. Если посредник крутится у вас прямо на хосте и вы вписали 127.0.0.1:8000, контейнер стучится сам в себя и ловит отказ соединения. Хост из контейнера виден по адресу моста, обычно 172.17.0.1, а на маке и винде через имя host.docker.internal.

куда смотрит контейнер
куда смотрит контейнер

Когда посредник внешний, этого вопроса нет, адрес одинаково виден отовсюду.

три монитора и ни одного свободного
byteflow
byteflow
Новичок
сообщений 225
с фев, второй сезон
22 августа, 17:07#6
gremlin_dv: контейнер стучится сам в себя

Вот оно. У меня в половине попыток стоял именно 127.0.0.1, потому что копировал с хоста. Спасибо.

Оксана В.
Оксана В.
Участник
сообщений 350
с дек
1 января, 08:24#7

Ещё есть штатное место, чтобы не таскать флаги руками. Файл ~/.docker/config.json на машине, где вы собираете:

{
  "proxies": {
    "default": {
      "httpProxy": "http://login:pass@193.0.2.44:8000",
      "httpsProxy": "http://login:pass@193.0.2.44:8000",
      "noProxy": "localhost,127.0.0.1,.local"
    }
  }
}

После этого клиент сам подставляет и аргументы сборки, и переменные в запускаемый контейнер. Правда, работает это только для клиента docker, сборщик со стороны сборочной машины его не читает.

anton_zzz
anton_zzz
Новичок
сообщений 96
с июн, второй сезон
8 июня, 11:41#8

а в compose как это писать

Оксана В.
Оксана В.
Участник
сообщений 350
с дек
15 ноября, 14:58#9

В compose то же самое, только через секции сервиса:

services:
  sbor:
    build:
      context: .
      args:
        http_proxy: ${HTTP_PROXY}
        https_proxy: ${HTTPS_PROXY}
    environment:
      HTTP_PROXY: ${HTTP_PROXY}
      HTTPS_PROXY: ${HTTPS_PROXY}
      NO_PROXY: localhost,127.0.0.1,db,redis
    env_file:
      - ./secrets.env

Обратите внимание на NO_PROXY: имена соседних сервисов туда надо вписывать обязательно, иначе обращение к своей же базе внутри сети compose уйдёт наружу и умрёт по таймауту.

linuxvsem
linuxvsem
Участник
сообщений 830
с июл
22 апреля, 17:15#10

Плюсую к именам сервисов, у нас на этом сутки ушли. Всё работало, кроме миграций, и никто не связывал их с посредником.

byteflow
byteflow
Новичок
сообщений 225
с фев, второй сезон
1 сентября, 08:32#11

Собрал итог для тех, кто найдёт тему поиском:

  • при сборке нужны аргументы сборки, при запуске переменные окружения, это разные вещи;
  • пару входа держать в переменных запуска, в слои образа её не класть;
  • адрес хоста изнутри контейнера это адрес моста, не петля;
  • соседние сервисы вписывать в исключения.

Всё поехало, к образу больше не возвращаюсь.