У меня есть несколько контейнеров для веб-приложения (nginx, gunicorn, postgres и узел для создания статических файлов из исходного кода и рендеринга на стороне сервера React).В Dockerfile для контейнера узла у меня есть два шага: сборка и запуск ( Dockerfile.node ).Он заканчивается двумя каталогами внутри контейнера: 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 и stackoverflow Q & As, и, как я понял, это должно работать, и нет никакой информации, что делать, когда это не так.
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
Nginx dockerfile: Dockerfile.nginx
UPD: Я создал упрощенное хранилище для воспроизведения вопроса: repo (есть некоторые предупреждения на npm install
, не смотря на то, что он устанавливается и собирается нормально).В конце концов, когда мы открываем localhost:80
, мы видим пустую страницу и 404 сообщения для статических файлов (vendor.js
и app.js
) в инструментах разработчика Chrome, но должно быть сообщение React app: static loaded
, сгенерированное сценарием реагирования.