# 容器重启 - discourse 尝试重新安装

**URL:** <https://meta.discourse.org/t/container-restart-discourse-tries-to-reinstall/159171>\
**Category:** Self-hosting\
**Tags:** unsupported-install\
**Created:** [2020年七月29日 13:20 UTC](https://meta.discourse.org/t/container-restart-discourse-tries-to-reinstall/159171 "2020-07-29T13:20:16Z")\
**Posts on this page:** 5\
**Page:** 2

<div class="post-metadata">

**Author:** ![justin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/justin/32/157614_2.png) [@justin](https://meta.discourse.org/u/justin)\
**Post date:** [2020年七月30日 14:51 UTC](https://meta.discourse.org/t/container-restart-discourse-tries-to-reinstall/159171/22 "2020-07-30T14:51:55Z")

</div>



---

<div class="post-metadata">

**Author:** ![justin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/justin/32/157614_2.png) [@justin](https://meta.discourse.org/u/justin)\
**Post date:** [2020年七月30日 14:53 UTC](https://meta.discourse.org/t/container-restart-discourse-tries-to-reinstall/159171/23 "2020-07-30T14:53:58Z")

</div>

与 @rosscdh 的一次侧面交流揭示了他的主要最终目标是在 Kubernetes 上运行 Discourse。这在此处并非受支持的配置。对于我们在 Docker/Kubernetes 相关方面的做法，确实存在合理的批评；然而，为了便于在自托管环境中使用，我们选择通过 `launcher` 采取这种方式。

我已重新开启此话题，但请保持文明和建设性。

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2020年七月30日 16:36 UTC](https://meta.discourse.org/t/container-restart-discourse-tries-to-reinstall/159171/24 "2020-07-30T16:36:16Z")

</div>

> [@rosscdh](#):
>
> 我知道你们都很喜欢这个启动器，但 docker-compose 不是也挺好的吗？

不过在 `./launcher` 开发出来之前，docker-compose 还没流行起来呢。😉

如果你想在 k8s 或类似环境中启动，我的做法是用 launcher 构建镜像并将其推送到某个地方，然后让 k8s 来启动该镜像。Launcher 会执行一些操作，比如在升级时迁移数据库，因此你需要留意其工作原理。

---

<div class="post-metadata">

**Author:** ![rosscdh](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rosscdh/32/188456_2.png) [@rosscdh](https://meta.discourse.org/u/rosscdh)\
**Post date:** [2020年七月30日 21:29 UTC](https://meta.discourse.org/t/container-restart-discourse-tries-to-reinstall/159171/25 "2020-07-30T21:29:55Z")

</div>

谢谢你的反馈，

目标是让它更像 Docker 化，以便既能运行在 Kubernetes 上，也能通过 Docker 独立容器运行。

我成功使用 launcher 生成了一个超过 2GB 的镜像（包含 4 个插件，由于限制无法添加 6 个）。

我还用 Docker Compose 编排了它，现在它变成了一个清晰的运行手册。

我熟悉 GlobalSettings，并稍微修改了 application.rb 和 routes.rb，因此我只是挂载了自定义配置。

```plaintext
version: '3'

networks:
  discourse-net:

services:
  mailhog:
    image: mailhog/mailhog:latest
    networks:
      - discourse-net
    ports:
      - 8025:8025

  postgres:
    image: postgres:9.6
    networks:
      - discourse-net
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_USER: discourse
      POSTGRES_DB: discourse

  redis:
    image: redis:alpine
    networks:
      - discourse-net

  discourse:
    image: discourse-monkey:latest
    working_dir: /var/www/discourse
    command: bash /var/www/discourse/entrypoint.sh
    # ports:
    # - 3000:3000 # use the nginx entrypoint
    networks:
      - discourse-net
    volumes:
      - ./entrypoint.sh:/var/www/discourse/entrypoint.sh
      - ./config/unicorn.rb:/var/www/discourse/config/unicorn.rb
      - ./config/application.rb:/var/www/discourse/config/application.rb
      - ./envs/production.rb:/var/www/discourse/config/environments/production.rb
      - ./overrides/routes.rb:/var/www/discourse/config/routes.rb
      - ./generated/public/assets:/var/www/discourse/public/assets
      - ./generated/public/images:/var/www/discourse/public/images
      - ./generated/public/uploads:/var/www/discourse/public/uploads
      - ./generated/public/javascripts:/var/www/discourse/public/javascripts
      - ./generated/public/svg-sprite:/var/www/discourse/public/svg-sprite

    environment:
      LANG: en_US.UTF-8
      DISCOURSE_DEFAULT_LOCALE: en
      RAILS_ENV: production
      ## 支持多少并发 Web 请求？取决于内存和 CPU 核心数。
      ## 将根据检测到的 CPU 由 bootstrap 自动设置，你也可以覆盖
      UNICORN_WORKERS: 3

      ## TODO: 此 Discourse 实例将响应的域名
      DISCOURSE_HOSTNAME: discuss.monkey.tech:3001
      DOCKER_USE_HOSTNAME: "true"

      ## 如果你希望容器启动时使用与上面指定的相同主机名（-h 选项）
      ## （默认为 "$hostname-$config"），请取消注释
      #DOCKER_USE_HOSTNAME: true

      ## TODO: 初始注册时将设为管理员和开发者的逗号分隔邮箱列表
      ## 例如 'user1@example.com,user2@example.com'
      DISCOURSE_DEVELOPER_EMAILS: 'me@example.com,you@example.com'

      ## TODO: 用于验证新账户和发送通知的 SMTP 邮件服务器
      # 需要 SMTP 地址、用户名和密码
      # 警告：SMTP 密码中的 '#' 字符可能会导致问题！
      DISCOURSE_SMTP_ADDRESS: mailhog
      #DISCOURSE_SMTP_PORT: 587
      DISCOURSE_SMTP_USER_NAME: mailhog
      DISCOURSE_SMTP_PASSWORD: password
      #DISCOURSE_SMTP_ENABLE_START_TLS: true # （可选，默认为 true）

      ## 如果你添加了 Lets Encrypt 模板，请取消注释以下行以获取免费 SSL 证书
      #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

      ## TODO: 配置与数据库的连接
      # DISCOURSE_DB_SOCKET: ''
      DISCOURSE_DB_HOST: postgres
      DISCOURSE_DB_USERNAME: discourse
      DISCOURSE_DB_PASSWORD: password
      DISCOURSE_REDIS_HOST: redis

      ## 此 Discourse 实例的 http 或 https CDN 地址（配置为拉取）
      ## 详见 https://meta.discourse.org/t/14857
      DISCOURSE_CDN_URL: http://discuss.monkey.tech:3001
      DISCOURSE_SERVE_STATIC_ASSETS: "true"

      SKIP_ENFORCE_HOSTNAME: '0'
      ENABLE_ASSETS_PIPELINE: '0'
      ENABLE_DB_MIGRATE: '0'

      DISCOURSE_ENABLE_CORS: 'false'
      DISCOURSE_CORS_ORIGIN: '*'
      #SKIP_DB_AND_REDIS: '1'

  nginx:
    image: fholzer/nginx-brotli
    # command: /bin/sh -c "envsubst < /etc/nginx/conf.d/discourse.template.conf > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" 
    ports:
      - 3001:80
    depends_on:
      - discourse
    networks:
      - discourse-net
    volumes:
      - ./config/nginx.application.conf:/etc/nginx/conf.d/default.conf
      - ./generated/public:/var/www/discourse/public
      - ./generated/nginx/cache:/var/nginx/cache

```

运行非常完美；所有流量都通过 nginx 路由，nginx 也共享 assets:precompile 的输出。

下一步是只需设置一些调用镜像的指令，以“按需”预编译资产和运行 db:migrate，或者直接使用 exec 执行相同操作（因为这些项不常变化），并看看是否能将这个 2.6GB 的镜像体积减小。

感觉干净多了，如前所述，pup 功能是可行的；我也 appreciates 它提供的功能。我对构建方式（直接运行并使用 sudo 策略）有很多保留意见（这很少是我或我所认识的人的工作方式）；通常镜像是独立构建并部署到其他地方的（如 kube、saltstack、nomad、docker-compose）。

我有一个潜在的 PR，用于添加 sample/kube.yml 和 applications/kubernetes.template.yml，因为有一些项目、覆盖项和设置需要禁用数据库和 Redis，然后在构建时实际禁用 Redis 和数据库，同时也禁用预编译。如果这感兴趣的话。

这是一次有趣的体验，感谢你的推动。

只有一个与 fixtures 相关的小奇怪问题（可能是由于多次调用 migrate 导致），  
请查看附件图片

 ![Screen Shot 2020-07-30 at 23.20.22](https://global.discourse-cdn.com/meta/original/3X/b/d/bd16eee77ff7d656cc946730f8961d727f4ca9bf.png)

---

<div class="post-metadata">

**Author:** ![rosscdh](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rosscdh/32/188456_2.png) [@rosscdh](https://meta.discourse.org/u/rosscdh)\
**Post date:** [2020年七月30日 21:35 UTC](https://meta.discourse.org/t/container-restart-discourse-tries-to-reinstall/159171/26 "2020-07-30T21:35:03Z")

</div>

我认为 docker-compose 是基于一个名为 “fig” 的工具开发的。

[上一頁](https://meta.discourse.org/t/container-restart-discourse-tries-to-reinstall/159171.md?page=1)
