Понимание томов докера и опций тома - PullRequest
0 голосов
/ 25 октября 2019

На основе:

https://shekhargulati.com/2019/01/18/dockerizing-a-vue-js-application/

Я пытаюсь запустить контейнер, поддерживающий горячую перезагрузку. Согласно приведенному выше руководству, это должно быть возможно при запуске команды docker run:

docker run -it -p 8081:8080 -v ${PWD}:/app/ -v /app/node_modules --name CONTAINER_NAME FRONTEND_IMAGE

Но я не понимаю эту часть: -v ${PWD}:/app/ -v /app/node_modules. Глядя на первую часть:

-v ${PWD}:/app/

Согласно документации:

https://docs.docker.com/storage/bind-mounts/

первым параметром -v является имя тома. Почему вы выбрали бы имя ${PWD} в качестве имени? В моем случае это: /home/user/code/sample001

Во втором случае:

-v /app/node_modules

у тома даже нет имени. Сравнивая это с примером из документации докера:

$ docker run -d \
  --name devtest \
  -v myvol2:/app \
  nginx:latest

Я не понимаю, как -v /app/node_modules даже имеет смысл.

Если я тогда сделаю:

$ docker inspect CONTAINER_NAME
       ...

        "HostConfig": {
            "Binds": [
                "/home/user/code/sample001:/app/"
            ],
         ...
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/user/code/sample001",
                "Destination": "/app",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "volume",
                "Name": "83cbd979484473e3a5a258b8dbad052bc8927e207aa2dc4afa73be72113d3102",
                "Source": "/var/lib/docker/volumes/83cbd979484473e3a5a258b8dbad052bc8927e207aa2dc4afa73be72113d3102/_data",
                "Destination": "/app/node_modules",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

-v ${PWD}:/app/ фактически создает привязку, а не том.

Чего мне не хватает?

1 Ответ

2 голосов
/ 25 октября 2019

Существует три типа томов: хост, анонимный и именной. см. Различные типы томов

/app/node_modules является анонимным томом и обрабатывается непосредственно Docker. Как упоминалось в статье:

, второй флаг -v гарантирует, что host node_modules не переопределяет node_modules контейнера. Чтобы гарантировать это, мы создаем том данных для / usr / src / app / node_modules. Если вы запустите команду docker run без второго флага -v, вы получите ошибку vue-cli-service: not found.

Встроенный образ содержит node_modules в app/node_modules. Если вы не укажете анонимный том во время инициализации контейнера, весь каталог app будет смонтирован внутри контейнера, перезаписывая существующий каталог node_modules. Если вы укажете это, docker будет монтировать том на хосте в /var/lib/docker/volumes. Чтобы выяснить, где он находится, выполните:

docker inspect -f '{{ .Mounts }}' containerid

Команда:

docker run -it -v ${PWD}:/usr/src/app -v /usr/src/app/node_modules -p 5000:5000 myapp

предназначена для выполнения в процессе разработки, чтобы монтировать источники в контейнер, поскольку они не копируются во времяbuild of dev image.

Все это делается для того, чтобы иметь исходные коды на хосте и держать модули в контейнере. Одна из причин заключается в том, что зависимости могут зависеть от операционной системы, поэтому важно разрабатывать с контейнерной версией узловых модулей.

Когда все готово для запуска в производство, образ создается из другого Dockerfile, который копирует исходники и устанавливает зависимости. В этом случае нет смонтированных томов:

docker build -f Dockerfile-prod -t myapp-prod .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...