Не удалось создать образ web_only для чистой установки

Привет :blush:

Я всё ещё пытаюсь настроить наш пайплайн для работы с Discourse. У меня есть свежий контейнер Redis и свежий контейнер Postgres, которые я планирую использовать с Discourse.
Следующий шаг, как я понимаю, — собрать образ контейнера web_only, чтобы затем соединить их и запустить установку, но у меня не получается выполнить начальную настройку (bootstrap) контейнера.

Я получаю следующую ошибку:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 4632 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
0e576a9672a887d23579100756224f920ab595b819874b5e7cbe4868f4234481
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.

Я запутался: почему система пытается выполнить миграцию, когда у меня ещё ничего не собрано? Неужели я делаю шаги неправильно?
Вот файл web_only.yml, который я использую (довольно простой):

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
env:
  LANG: en_US.UTF-8
  UNICORN_WORKERS: 2
  DISCOURSE_DB_USERNAME: root
  DISCOURSE_DB_PASSWORD: my-secret-pw
  DISCOURSE_DB_HOST: 127.0.0.1
  DISCOURSE_DB_NAME: communities
  DISCOURSE_DEVELOPER_EMAILS: 'email@mail.com'
  DISCOURSE_HOSTNAME: 'localhost'
  DISCOURSE_REDIS_HOST: 127.0.0.1
  SKIP_POST_DEPLOYMENT_MIGRATIONS: 1
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - mkdir -p plugins
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-voting.git
          - git clone https://github.com/discourse/discourse-slack-official.git
          - git clone https://github.com/discourse/discourse-assign.git
run:
  - exec:
      cd: /var/www/discourse
      cmd:
        - sed -i 's/GlobalSetting.serve_static_assets/true/' config/environments/production.rb
        - bash -c "touch -a /shared/log/rails/{sidekiq,puma.err,puma}.log"
        - bash -c "ln -s /shared/log/rails/{sidekiq,puma.err,puma}.log log/"
        - sed -i 's/default \$scheme;/default https;/' /etc/nginx/conf.d/discourse.conf

Нужно ли, чтобы контейнеры Postgres и Redis были запущены каждый раз, когда я выполняю сборку (bootstrap)? Я думал, что могу подготовить образы, загрузить их самостоятельно, а затем запускать свои окружения с этими образами, не выполняя никаких операций с базой данных…

Пайплайн, который от меня требуется создать, выглядит так:

  • GitHub Actions: должен выполнять сборку образа в случае необходимости обновления.
    • Загружать образ в частный реестр.
  • Затем мой кластер Kubernetes может получать обновления и разворачивать их в моих окружениях, от разработки до продакшена.

Ещё раз большое спасибо за всю помощь и поддержку. :sparkles:

Я думаю, что ваша проблема в том, что 127 не работает внутри контейнера. Процесс инициализации (bootstrap) выполняет миграцию базы данных. Если вы не хотите, чтобы база данных мигрировалась, вам нужно изменить шаблон или использовать временную базу данных.

Спасибо за ваш ответ :slight_smile:
Подскажите, пожалуйста, как избежать/пропустить миграцию базы данных? Я думал, что это делается через SKIP_POST_DEPLOYMENT_MIGRATIONS: 1

Я не могу. Рекомендую создать временную базу данных, которую вы удалите после миграции.

И при этом вам нужно убедиться, что все эти действия выполняются при развертывании нового образа.

Суть в том, что я не понимаю, почему происходит миграция базы данных, когда нечего мигрировать, ведь я создаю своё первое изображение для чистой установки :frowning:

Миграция — это технический термин, используемый в контексте Rails. Миграции в основном создают правильную структуру базы данных.

Discourse не может работать, если база данных не заполнена необходимыми таблицами и данными. Также требуется предварительная компиляция ассетов. Если вы планируете развертывание другим способом, вам нужно понимать, как это работает.

Спасибо, что прояснили это для меня. Я думал, что первая структура БД может быть создана при первом запуске форума.

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

Это возможно, но вам нужно сделать это явно. Самый простой способ создать образ — позволить ему мигрировать пустую базу данных.

Тогда я постараюсь убедить свою команду запросить временную базу данных Postgres во время конвейера GitHub. Большое спасибо за всю помощь.