Я не вижу проблемы с тем, что у вас здесь.Я скопировал ваш docker-compose.yml
и удалил только часть entrypoint:
, и он работал для меня.
docker-compose.yml
version: '3'
services:
webapp:
build:
context: .
dockerfile: ./web/Dockerfile
volumes:
- ./web/:/usr/src/app/
- staticfile_volume:/usr/src/app/public
nginx:
build:
context: .
dockerfile: ./nginx/Dockerfile
depends_on:
- webapp
volumes:
- staticfile_volume:/usr/src/app/public
volumes:
staticfile_volume:
web / Dockerfile
FROM ubuntu:18.04
CMD tail -f /dev/null
nginx / Dockerfile
FROM nginx:latest
CMD tail -f /dev/null
Демонстрация:
Чтобы пояснить комментарий DannyB выше, убедитесь, что вы не создаете файл на хосте в web/public
, так как эта папка монтируется при запуске контейнеров.Том Docker работает аналогично стандартному монтированию Linux - Docker просто монтирует новый том поверх существующего каталога.
Если вы хотите запустить команду внутри контейнера Docker, который изменяет файлы нафайловая система вашего хоста, не используйте док-том - вместо этого используйте bind mount , как вы сделали здесь: - ./web/:/usr/src/app/
.
Разница между bind mount и том докера - это то, что устройство bind монтирует файлы с вашего хоста внутри вашего контейнера и будет полагаться на те папки / файлы, которые находятся в вашей файловой системе хоста, а том докера будет полностью управлятьсяdocker и может использоваться совместно только контейнерами, но не хостом (хотя эти файлы где-то живут на хосте, их нецелесообразно отследить и попытаться использовать).
Вы можете простоудалите том докера из вашего docker-compose
файла и добавьте привязку для nginx, и вы начнете видеть поведение, которое вы 'после:
docker-compose.yml
version: '3'
services:
webapp:
build:
context: .
dockerfile: ./web/Dockerfile
volumes:
- ./web/:/usr/src/app/
nginx:
build:
context: .
dockerfile: ./nginx/Dockerfile
depends_on:
- webapp
volumes:
- ./web/public:/usr/src/app/public
Демо: