Моё виртуальное пространство: NodeJS
Объясняю мои принципы работы с Docker-контейнерами - как я использую их в качестве виртуальных пространств, чтобы не засорять основную рабочую машину узко-специализированным софтом. Показываю на примере контейнера с NodeJs.
Предисловие
Какие-то веб-проекты включают в себя указания для "докеризации" - файлы Dockerfile и docker-compose.yml. В каких-то случаях такого нет - например, если мне нужно запустить пример из библиотеки или туториала. Для этого мне необязательно устанавливать на рабочую машину Node.js (или PHP - пример с ним будет рассмотрен в другой раз).
На моей рабочей машине по пути ~/projects/vm
есть несколько папок. Одна из них называется node-21.2.0-alpine3.17
. В ней содержатся два файла: Dockerfile
и run.sh
Файл: Dockerfile
FROM node:21.2.0-alpine3.17
RUN apk update
# для возможности использования git clone
RUN apk add git
RUN rm -rf /var/cache/apk/*
Файл: run.sh
#!/usr/bin/bash
docker run \
-it \
--entrypoint sh \
--user 1000 \
--mount type=bind,source=/home/iam/projects/,target=/home/node/projects/ \
-w /home/node/projects/ \
vm/node-21.2.0-alpine3.17
Результат
Чтобы выполнить npm скрипт в проекте (в том числе - стандартная команда npm run dev / yarn dev для запуска проекта), я захожу в оболочку node контейнера. В терминале рабочей машины:
$ bash ~/projects/vm/node-21.2.0-alpine3.17/run.sh
Внутри контейнера мне доступна моя папка проектов, и также мне доступны команды "node", "npm" и "yarn", поскольку они установлены в контейнере.
Пример: новый проект на Vue 3
~/projects/sandbox/vue3-example/
, и у нас уже создан путь ~/projects/sandbox/
. Напоминаю, что у нас не установлены ни node, ни npm, ни yarn. Заходим в оболочку контейнера node: $ bash ~/projects/vm/node-21.2.0-alpine3.17/run.sh
Внутри контейнера входим в родительскую папку нового проекта: $ cd ~/projects/sandbox
И тут уже выполняем нужную команду инициализации: $ yarn create vue@latest
Затем установка библиотек и запуск dev-сервера: $ yarn
$ yarn dev
Ключевые моменты
В инструкции из run.sh есть аргумент --user 1000
. Это идентификатор пользователя, принадлежащего контейнеру (не рабочей машине), под которым будет проведён логин после входа в контейнер. Он намеренно совпадает с идентификатором пользователя рабочей машины (1000
для пользователя по умолчанию на Ubuntu системах; проверьте выход команды id -u
, если Вы работаете в Linux-based ОС) - во избежание разногласий в разрешениях доступа к файлам.