На данный момент у меня есть несколько контейнеров для веб-приложения (nginx, gunicorn, postgres и node для создания статических файлов из исходного кода и рендеринга на стороне сервера React). В Dockerfile для контейнера node у меня есть два шага: сборка и запуск (Dockerfile .узел). Он заканчивается двумя каталогами внутри контейнера: bundle_client
— статический для nginx и bundle_server
— он используется в самом контейнере узла для запуска экспресс-сервера.
Затем мне нужно поделиться встроенной статической папкой (bundle_client
) с контейнером nginx. Для этого в соответствии со ссылкой на docker-compose в моем docker-compose.yml
у меня есть следующие сервисы (см. полный docker-compose.yml):
node:
volumes:
- vnode:/usr/src
nginx:
volumes:
- vnode:/var/www/tg/static
depends_on:
- node
и объемы:
volumes:
vnode:
Выполнение docker-compose build
завершается без ошибок. При запуске docker-compose up
все работает нормально, и я могу открыть localhost:80
, и есть nginx, gunicorn и node express SSR, все отлично работает, и я вижу веб-страницу, но все статические файлы возвращают ошибку 404 не найдено.
Если я проверю тома с помощью docker volume ls
, я увижу два вновь созданных тома с именами tg_vnode
(которые мы рассматриваем здесь) и tg_vdata
(см. полный файл docker-compose.yml)
Если я войду в контейнер nginx с docker run -ti -v /tmp:/tmp tg_node /bin/bash
, я не увижу свою папку www/tg/static
, которая должна отображать мои статические файлы из тома узла. Также я попытался создать пустую папку /var/www/tg/static
с контейнером nginx Dockerfile.nginx
, но она остается пустой.
Если я сопоставляю папку bundle_client
с хост-компьютера в docker-compose.yml
в разделе nginx.volumes
как - ./client/bundle_client:/var/www/tg/static
, все работает нормально, и я могу видеть все статические файлы, обслуживаемые nginx в браузере.
Что я делаю неправильно и как заставить мой контейнер делиться встроенным статическим контентом с контейнером nginx?
PS: я прочитал всю документацию, все проблемы с github и вопросы и ответы по стеку, и, как я понял, это должно работать, и нет информации, что делать, когда это не так.
UPD: Результат docker volume inspect vnode
:
[
{
"CreatedAt": "2018-05-18T12:24:38Z",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "tg",
"com.docker.compose.version": "1.21.1",
"com.docker.compose.volume": "vnode"
},
"Mountpoint": "/var/lib/docker/volumes/tg_vnode/_data",
"Name": "tg_vnode",
"Options": null,
"Scope": "local"
}
]
Файлы: Dockerfile.node, docker-compose.yml
Dockerfile Nginx: Dockerfile.nginx
UPD: я создал упрощенное репо, чтобы воспроизвести вопрос: репозиторий (на npm install
есть несколько предупреждений, не говоря уже о том, что он устанавливается и собирается нормально). В конце концов, когда мы открываем localhost:80
, мы видим пустую страницу и сообщения 404 для статических файлов (vendor.js
и app.js
) в инструментах разработчика Chrome, но должно быть сообщение React app: static loaded
, сгенерированное реагирующим скриптом.
nocopy
option. Я вижу в вашем сочинении, что вы использовали его в нескольких местах, только одно место поместит его содержимое в том и выиграет с исходным содержанием. Сборка поместит файлы во время выполнения, если это происходит после монтирования. Мне трудно визуализировать вашу композицию, но посмотрите, помогут ли эти указатели. - person Tarun Lalwani   schedule 21.05.2018bundle_client
артефакт в том, а затем использовать его в nginx контейнер. И я удостоверяюсь, что контейнер узла находится первым в порядке, устанавливаяdepends_on.node
для контейнераnginx
. Возможно, я перепутал Dokerfile и compose file и неправильно понял, как это на самом деле работает. Не могли бы вы объяснить - сборка помещает файлы во время выполнения, если это происходит после монтирования. Я не уверен, что понимаю это. - person Max   schedule 21.05.2018nocopy: true
кnginx.volumes
в соответствии с длинным синтаксисом и прокомментировал использованиеvnode
в контейнере gunicorn, но, к сожалению, папка внутри контейнера nginx все еще пуста. - person Max   schedule 21.05.2018docker-volume
к вопросу, пожалуйста? Заранее спасибо. - person Alejandro Galera   schedule 21.05.2018bundle_client
с nginx по адресуvar/www/test/static
.. верно? - person Tarun Lalwani   schedule 21.05.2018docker-compose up
, а затем открытьlocalhost
и посмотреть, как обслуживаются все новые связанные статические данные. - person Max   schedule 21.05.2018docker-compose
и, возможно, сdocker-stack
в будущем), создания новой версии статических файлов (и обновления других частей) и повторного развертывания нового выпуска. В режиме разработки я использую том хоста./client:/var/www...
, и он работает нормально, но в новом выпуске (развертывании) я должен сказать докеру, чтобы он автоматически создавал файлы и делился ими с nginx. - person Max   schedule 21.05.2018Dockerfile.node
нетCMD
? Также не определен сценарий запуска вpackage.json
? - person Tarun Lalwani   schedule 21.05.2018