Install Discourse for development using Docker

Должно быть d/rake admin:create, я полагаю…

К сожалению, нет :frowning:
OCI runtime exec failed: exec failed: unable to start container process: exec: "bin/rake": stat bin/rake: no such file or directory: unknown

Каков был результат команды d/boot_dev --init?

Использование исходников в: /home/martyn/discourse
Использование данных в:   /home/martyn/discourse/data/postgres
release: Загрузка из образа discourse/discourse_dev
Хэш-сумма: sha256:b64199f510bd9831af81ba8268bef3beff2abb45d0a264a0e29b35cfc3986f05
Статус: Образ discourse/discourse_dev:release уже актуален
docker.io/discourse/discourse_dev:release
docker: Ошибка ответа от демона: Конфликт. Имя контейнера "/discourse_dev" уже используется контейнером "44c83548a9a9060716aa7d4fd803e239227f48375625f1d27da19b3d4162c56a". Необходимо удалить (или переименовать) этот контейнер, чтобы иметь возможность использовать это имя повторно.
Смотрите 'docker run --help'.

OK, значит, вы собрали контейнер.

Это очень странно. Я только что установил всё с нуля в WSL, и у меня всё заработало, хотя мне пришлось вручную выполнить d/exec yarn.

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

2 лайка

Я работаю над настройкой окружения разработки Discourse по инструкциям для Docker, но при выполнении любых команд Yarn возникают ошибки. Команды Ruby работают нормально, но запуск d/yarn (и любых его подкоманд) завершается ошибкой:

discourse(v3.1.3) $ d/exec yarn -v

<--- Последние несколько GC --->


<--- Стек JS --->


#
# Фатальная ошибка OOM в JavaScript: выделение MemoryChunk не удалось при десериализации.
#

У меня Fedora 39 с Docker 24.0.7. Я не вносил никаких изменений, кроме как клонировал Discourse из Git и переключился на тег v3.1.3.

Кто-нибудь сталкивался с этой ошибкой ранее? Спасибо!

Похоже, что заканчивается память:

Сколько у него оперативной памяти?

В моей машине 64 ГБ оперативной памяти, и я не думаю, что устанавливал какие-либо ограничения на использование памяти Docker. У меня просто стандартная установка Docker.


Редактирование: интересно, команды Node работают, а Yarn не работает:

discourse(v3.1.3*) $ d/exec node -v
v18.17.1
discourse(v3.1.3*) $ d/exec yarn -v

<--- Последние несколько GC --->


<--- Стек JS --->


#
# Фатальная ошибка JavaScript OOM при выделении MemoryChunk не удалась во время десериализации.
#

Краткое обновление: при дальнейших тестах команды Node также не выполняются:

discourse(v3.1.3*) $ d/exec node --help

<--- Последние несколько GC --->


<--- Стек вызовов JS --->


#
# Фатальная ошибка переполнения памяти в JavaScript: выделение MemoryChunk не удалось во время десериализации.
#

Любая команда, кроме d/exec node -v, выдаёт эту ошибку. :thinking: Буду продолжать расследование и попробую найти решение.

Я нашел решение своей проблемы. Процесс немного запутанный и «костыльный», но он работает. Вкратце: обновление до Node.js 20.x.x устранило мою проблему.

Я создал образ Docker, использующий Node.js v20.x.x вместо стандартного v18.x.x, который применяется в образе разработки Discourse.

Для начала я создал этот Dockerfile:

# ИМЯ: discourse_node20
FROM discourse/discourse_dev:release

# обновление node до LTS 20.x.x
ENV NODE_MAJOR=20
RUN apt-get update
RUN apt-get install -y ca-certificates curl gnupg
RUN mkdir -p /etc/apt/keyrings
RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
RUN apt-get update
RUN apt-get install nodejs -y

Затем я собрал образ: docker build -t discourse_node20 - < Dockerfile

После этого я обновил команду docker run в d/boot_dev, чтобы использовать образ discourse_node20 и не тянуть discourse/discourse_dev:release, так как он больше не нужен. Вот обновленная команда в d/boot_dev:

# закомментируйте строку ниже
# docker pull discourse/discourse_dev:release
docker run \
    -d \
    -p $local_publish:8025:8025 \
    -p $local_publish:3000:3000 \
    -p $local_publish:4200:4200 \
    -p $local_publish:9292:9292 \
    -p $local_publish:9405:9405 \
    -v "$DATA_DIR:/shared/postgres_data:delegated" \
    -v "$SOURCE_DIR:/src:delegated" \
    -e UNICORN_BIND_ALL=true \
    -e NODE_OPTIONS=--max_old_space_size=8192 \
    $mount_plugin_symlinks \
    $ENV_ARGS \
    --hostname=discourse \
    --name=discourse_dev \
    --restart=always \
    discourse_node20 /sbin/boot

После этого мне удалось успешно выполнить d/boot_dev --init, d/rails s и d/ember-cli, получив рабочую среду разработки в Docker 24 и Fedora 39.


Я не знаю, почему Node 20.x.x решает проблему. Надеюсь, это будет исправлено в основном образе разработки на стороне разработчиков. Я был бы рад внести вклад через pull request, но обновление основной зависимости кажется чем-то большим, чем просто случайный PR от меня. :smile_cat: Ну, по крайней мере, сейчас я не заблокирован!

У кого-то получилось запустить это на Raspberry Pi? (Да, я знаю, что конфигурация для продакшена поддерживается). Какие изменения или настройки нужны?

Я получаю:

WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

А затем контейнер просто падает и постоянно перезапускается.

ОБНОВЛЕНИЕ: А, я вижу, что поддерживающий образ ещё не добавлен? Сравните:

(который поддерживается)

с

Для последнего нет версии arm64…

Кто-нибудь на Mac OS (13.6.3) (Intel) успешно запустил Discourse в Docker и может поделиться, как обойти ошибку Error: Cannot find module 'esbuild'?

Я заметил, что в приложении boot_dev команда yarn никогда не выполняется для корневой директории, только для app/assets/javascripts/discourse:

echo "Yarn install..."
"${SCRIPTPATH}/exec" yarn install --cwd app/assets/javascripts/discourse

Поэтому логично, что esbuild не установлен, так как это зависимость, описанная в package.json корневой директории.

Однако этот package.json нельзя установить вне контейнера, так как будет установлена неправильная версия esbuild (для Mac, а не Linux… а контейнеру нужен Linux).

Разве в boot_dev не должна быть строка сразу над “installing gems”, выглядящая так?

echo "Installing top-level package.json ..."
"${SCRIPTPATH}/exec" yarn install

Когда я добавляю такую строку, мне удаётся пройти этап миграций без ошибки esbuild…

Это уже исправлено? Я установил и запустил, но на следующий день, когда я вернулся к этому и запустил d/boot_dev, получил это предупреждение, и контейнер больше не создается.

Разработка Discourse, скорее всего, не будет работать с использованием эмуляции архитектуры Docker.
Пожалуйста, попробуйте нативную установку для разработки.
Используем исходный код в: /Users/n_selvidge/discourse
Используем данные в:   /Users/n_selvidge/discourse/data/postgres
1 лайк

Как установить Discourse для разработки через http_proxy?

Свяжитесь с провайдером прокси и убедитесь, что такие вызовы разрешены.

Получил ту же ошибку при запуске d/rails s,

/home/discourse/.bundle/gems/ruby/3.2.0/gems/activerecord-7.0.8.1/lib/active_record/connection_adapters/postgresql_adapter.rb:87:in `rescue in new_client': connection to server at "10.169.51.142", port 5432 failed: Connection refused (ActiveRecord::ConnectionNotEstablished)
	Is the server running on that host and accepting TCP/IP connections?

Буду благодарен за любую помощь!

d/rails s возвращает:
Ошибка ответа от демона: контейнер discourse_dev не найден.

Есть какие-либо предложения?

1 лайк

Вы сначала запустили d/boot_dev?

1 лайк

Привет, можно ли привязать его к 0.0.0.0 вместо этого?

image

Да, я ввёл это, спасибо. Чтобы начать заново, я так понимаю, нужно удалить контейнер через графический интерфейс Docker, а также папку с репозиторием Discourse?