Я создаю веб-приложение, структура файла которого выглядит примерно так:
db/
Dockerfile
init/
00-init.sql
graphql/
Dockerfile
app/
Dockerfile
package.json
bin/
www
public/
index.html
index.js
app.js
frontend/
.babelrc
package.json
webpack.config.js
src/
index.jsx
docker-compose.yml
Проект состоит из трех контейнеров: db
запускает сервер postgres, graphql
запускает postgraphile (для автоматической генерации схемы GraphQL и обработки запросов GraphQL), а app
- это приложение express.
Мой код внешнего интерфейса содержится в отдельном пакете в app/frontend
. Как правило, я запускаю npm run build
в этом каталоге для вызова веб-пакета, встраивая содержимое app/frontend/src
в распространяемый файл в app/public/index.js
. Таким образом, создание внешнего интерфейса является автономным процессом, а само приложение просто обслуживает внешний интерфейс.
Вот моя дилемма: я пытаюсь добавить поддержку Relay в свой внешний интерфейс. Это требует дополнительного шага в сборке внешнего интерфейса, а именно запускает relay-compiler. Но для релейного компилятора требуется схема GraphQL. Поскольку я использую postgraphile, у меня нет схемы во время автономной сборки. Postgraphile может выдавать файл схемы (с --export-schema-graphql
), но на данный момент я запускаю только postgraphile внутри контейнера - мой контейнер БД должен запустить и инициализировать базу данных, после чего postgraphile может соединиться и сгенерировать схема, в этот момент у меня есть файл graphql.schema ... сидит внутри контейнера graphql. Но все это происходит после того, как я раскручиваю приложение - перед этим мне нужен файл схемы, как часть автономной сборки.
Я все еще довольно зеленый с Docker, GraphQL, postgraphile и особенно Relay - так что я надеюсь, что кто-то, кто более знаком с этими технологиями, может придать мне мудрости. Я не нашел большого количества ресурсов, специально предназначенных для использования Relay с postgraphile.
Вместо определенных c лучших практик, возможно, кто-то, кто более знаком с современной веб-разработкой, может помочь мне разобраться в этих вариантах. :
Обновлять ли мой интерфейс так, чтобы он мог полностью развернуть сервер postgres и запустить postgraphile (только в зависимости от dev), затем добавить автономный скрипт, который генерирует схему Файл .graphql для собственного использования? Это похоже на большой беспорядок.
Обновляю ли я свой контейнер graphql, чтобы он всегда записывал файл схемы, и просто вручную копировал и вставлял этот файл в мой интерфейс по мере необходимости ?
Добавлять ли мне дополнительный процесс (который я запускаю вручную при каждом изменении схемы базы данных) вне любого контейнера (возможно, через альтернативный docker -компонентный файл) что раскручивает подмножество моего стека приложений, выводит схему graphql и завершает работу? Если да, то есть ли какой-либо способ указать контейнеру Docker записать файл на хост-машине или монтировать локальный каталог в контейнере как лучший способ выполнить sh это?
Есть ли лучший способ структурирования моего проекта, который позволит избежать этой проблемы? Я новичок в Docker и чувствую, что, может быть, мой мозг просто разделен между мышлением до Docker и после Docker.