Я создаю веб-приложение, файловая структура которого выглядит примерно так:
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
является экспресс-приложением.
Мой код внешнего интерфейса содержится в отдельном пакете в app/frontend
. Обычно я запускаю npm run build
в этом каталоге, чтобы вызвать webpack, преобразовывая содержимое app/frontend/src
в распространяемую форму в app/public/index.js
. Таким образом, создание интерфейса является автономным процессом, а само приложение просто обслуживает интерфейс.
Вот моя дилемма: я пытаюсь добавить поддержку Relay в свой интерфейс. Для этого требуется дополнительный шаг в сборке внешнего интерфейса, а именно запуск relay-compiler. Но для релейного компилятора требуется схема GraphQL. Поскольку я использую postgraphile, у меня фактически нет схемы во время автономной сборки. Postgraphile может выдавать файл схемы (с --export-schema-graphql
), но на данный момент я запускаю только postgraphile в контейнере - мой контейнер db должен запуститься и инициализировать базу данных, после чего postgraphile может подключиться и сгенерировать схему, в этот момент у меня есть файл graphql.schema ... находящийся внутри контейнера graphql. Но все это происходит после того, как я запустил приложение - мне нужен файл схемы до этого, как часть автономной сборки.
Я все еще довольно хорошо знаком с Docker, GraphQL, postgraphile и особенно с Relay - поэтому я надеюсь, что кто-то, кто более знаком с этими технологиями, сможет поделиться со мной мудростью. Я не нашел большого количества ресурсов, специально посвященных использованию Relay с postgraphile.
Вместо конкретных передовых методов, возможно, кто-нибудь, кто более знаком с современной веб-разработкой, может помочь мне разобраться в следующих вариантах:
Могу ли я обновить свой интерфейс так, чтобы он полностью мог запускать сервер postgres и запускать postgraphile (только в зависимости от разработчика), а затем добавить автономный скрипт, который генерирует файл schema.graphql для собственного использования? Это похоже на большой беспорядок.
Могу ли я обновить свой контейнер graphql, чтобы он всегда записывал файл схемы, и просто вручную копировать и вставлять этот файл в мой интерфейс по мере необходимости?
Могу ли я добавить дополнительный процесс (который я бы запускал вручную каждый раз при изменении схемы моей базы данных), внешний по отношению к любому контейнеру (возможно, через альтернативный файл docker-compose), который раскручивает подмножество моего стека приложения, выгружает схему graphql , а выходит? Если да, то есть ли способ направить контейнер Docker для записи файла на хост-машину, или установка локального каталога в контейнер - лучший способ для этого?
Есть ли лучший способ структурировать мой проект, который в первую очередь позволяет избежать этой проблемы? Я новичок в Docker, и мне кажется, что, возможно, мой мозг просто разделен между мышлением до и после докера.