Docker иногда не может подключиться к github.com

При попытке обновить Discourse через ./launcher rebuild app возникает ошибка:

fatal: unable to access 'https://github.com/discourse/REPO.git/': Failed to connect to github.com port 443: Connection timed out

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

Я видел это:

Но я не знаю, как отладить сетевую конфигурацию контейнера.

У вас не совсем та проблема, о которой говорится в связанной вами теме, и похоже, что у вас периодическая проблема, которая всегда сложнее всего диагностируется. Но, возможно, вы могли бы попробовать ручную загрузку. Я попробовал это, что безвредно:

# cd /var/discourse/
# ./launcher enter app
Обнаружена архитектура x86_64.
# wget -O - -v https://github.com/discourse/logster.git/ |wc
--2023-01-04 15:30:25--  https://github.com/discourse/logster.git/
Разрешение github.com (github.com)... 140.82.121.4
Подключение к github.com (github.com)|140.82.121.4|:443... успешно.
HTTP-запрос отправлен, ожидается ответ... 301 Moved Permanently
Расположение: https://github.com/discourse/logster/ [следование]
--2023-01-04 15:30:25--  https://github.com/discourse/logster/
Повторное использование существующего соединения с github.com:443.
HTTP-запрос отправлен, ожидается ответ... 200 OK
Длина: не указана [text/html]
Сохранение в: 'STDOUT'

-                                                  [ <=>                                                                                                 ] 231,22K  --.-КБ/с    в 0,06с   

2023-01-04 15:30:26 (3,99 МБ/с) - записано в stdout [236767]

   2751   15860  236767
#

Мы видим, что “github.com” был переведен в разумный IP-адрес, с ним установили соединение, и он вернул некоторые данные. Фактически команда, выполненная внутри контейнера, работала очень похоже на то, как она работает вне контейнера, что и ожидалось.

Вы используете поддерживаемый рецепт установки на известной хостинговой компании?

Первая попытка выдала

Connecting to github.com (github.com)|140.82.121.4|:443... failed: Connection timed out.
Retrying.

Метод установки по умолчанию

зависит от того, как вы определяете «известную», но это довольно крупный игрок

Хорошо, значит, он хотя бы пытается связаться с разумным IP-адресом. Я подозреваю проблемы с маршрутизацией, фаерволом или что-то на стороне хостинг-провайдера.

Если вы запустите тест вне контейнера, вы поймёте, проблема ли это конкретного контейнера или более общая проблема Linux.

Это проблема, специфичная для контейнера. Мне трудно понять, что могло её вызвать, так как я не вносил изменений в контейнер ранее, а сайту около 1,5 лет.

Хм, значит, вне контейнера вы можете запустить этот тест стабильно?

Может быть, вы могли бы поделиться обезличенной версией вашего app.yml? (У меня нет идей, что может происходить, но, возможно, кто-то заметит что-то.)

Как давно установлена текущая версия — какая версия и какой ID отображаются в вашей панели управления?

да

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"
  db_shared_buffers: "128MB"
  #db_work_mem: "40MB"
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en
  UNICORN_WORKERS: 2
  DISCOURSE_HOSTNAME: domain.example.com

  #DOCKER_USE_HOSTNAME: true

  DISCOURSE_DEVELOPER_EMAILS: 'some@emails.com'

  DISCOURSE_SMTP_ADDRESS: smtp.domain.com
  DISCOURSE_SMTP_PORT: port
  DISCOURSE_SMTP_USER_NAME: email@email.com
  DISCOURSE_SMTP_PASSWORD: "password"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (опционально, по умолчанию true)
  DISCOURSE_SMTP_DOMAIN: domain.com
  DISCOURSE_NOTIFICATION_EMAIL: email@email.com

  ## Если вы добавили шаблон Lets Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
  LETSENCRYPT_ACCOUNT_EMAIL: email@email.com

  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Контейнер Docker не сохраняет состояние; все данные хранятся в /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Плагины размещаются здесь
## подробности см. на https://meta.discourse.org/t/19157
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/discourse-math.git
          - git clone https://github.com/discourse/discourse-reactions.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-whos-online.git
          - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/discourse/discourse-cakeday.git
          - git clone https://github.com/discourse/discourse-akismet.git
          - git clone https://github.com/discourse/discourse-data-explorer.git
          - git clone https://github.com/discourse/discourse-gamification
          - git clone https://github.com/discourse/discourse-checklist
          - git clone https://github.com/discourse/discourse-footnote
          - git clone https://github.com/discourse/discourse-yearly-review
          - git clone https://github.com/discourse/discourse-encrypt.git

## Любые пользовательские команды для выполнения после сборки
run:
  - exec: echo "Начало пользовательских команд"
  - exec: echo "Конец пользовательских команд"

Примечание: я пробовал собирать приложение без каких-либо плагинов. Либо не удаётся загрузить сам Discourse, либо не удаётся клонировать третий или четвёртый плагин в списке (что означает, что при наличии только 2–3 плагинов приложение удаётся собрать с третьей-четвёртой попытки).

Это была версия 2.9.0.beta14 непосредственно перед попыткой обновления до 3.0.0.beta15. Конкретный ID не помню, но последнее обновление было где-то 25–26 декабря.

Вам определённо стоит быть менее неопределённым в отношении используемого вами провайдера. Они сильно различаются по сложности своих сетей.

Скорее всего, устранение этой проблемы вслепую займёт гораздо больше времени.

Дело не в том, что я пытался ограничить доступную информацию, а в том, что имя само по себе ничего не скажет, поскольку это не западная компания. Экземпляр был размещён у reg.ru — крупнейшего хостинг-провайдера в России. В любом случае, их поддержка на этот раз[1] тоже не помогла, поэтому я перенёс свой сайт на Digital Ocean. При тех же настройках и той же процедуре установки Docker всё заработало (и, похоже, продолжает работать) без проблем.


  1. обычно они довольно хороши ↩︎