Docker有时无法连接到github.com

在尝试通过 ./launcher rebuild app 升级 Discourse 时,我遇到了一个问题:

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

然而,问题是:有时这即使对于 Discourse 也会失败。但是,如果你立即再次尝试,没有任何更改,它可能会成功,但在某个插件上失败。如果我删除所有插件,Discourse 连接可能会失败,或者它可能会成功并实际构建整个东西。

我看到过这个:

但我不知道如何调试容器网络。

1 个赞

您遇到的问题与您链接的帖子中描述的问题不完全一样,而且您似乎遇到了间歇性问题,这类问题总是最难诊断的。但也许您可以尝试手动获取。我尝试了以下操作,这个操作是无害的:

# 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
Location: 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  --.-KB/s    在 0.06s 内

2023-01-04 15:30:26 (3.99 MB/s) - 已写入 stdout [236767]

   2751   15860  236767
#

我们看到“github.com”被解析到一个合理的 IP 地址,已成功连接并返回了一些数据。事实上,在容器内运行的命令与在容器外运行的行为非常相似,这符合预期。

您是否正在使用受支持的安装配方,并且托管在知名的托管公司上?

1 个赞

第一次尝试给出了

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

默认安装方法

这取决于你如何定义“知名”,但这是一家相当大的公司

好的,它至少在尝试联系一个合理的 IP 地址。我怀疑是路由、防火墙或托管公司级别出了问题。

如果在容器外重新运行测试,您将看到是容器特定的问题还是更普遍的 Linux 问题。

1 个赞

这是一个容器特定的问题。我很难理解是什么导致了这个问题,因为我以前没有修改过容器,而且这个网站已经运行了大约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           # (optional, default 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 "Beginning of custom commands"
  - exec: echo "End of custom commands"

注意:我尝试过不带任何插件构建应用程序。它要么无法获取 discourse 本身,要么无法克隆列表中的第 3 个或第 4 个插件(这意味着只有 2-3 个插件,我可以在第 3-4 次尝试中构建一个应用程序)。

在我尝试升级到 3.0.0.beta15 之前是 2.9.0.beta14,不记得具体的 ID 了,但上次升级是在 12 月 25-26 日左右。

您能更明确地说明您使用的提供商,那肯定会有所帮助。他们的网络复杂程度差异很大。

这样盲目地排查问题可能要花费更长的时间。

4 个赞

我并不是想限制可用的信息,而是想知道这个名字是否对你有意义,因为它不是一家西方公司。这个实例是由俄罗斯最大的主机提供商 reg.ru 托管的。不管怎样,他们这次的支持[1] 也没有提供帮助,所以我把我的网站迁移到了 digital ocean。使用相同的设置,相同的 Docker 安装过程,一切都(并且似乎)运行正常。


  1. 他们通常相当不错 ↩︎

2 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.