Я хочу создать новое приложение nextjs в моем текущем каталоге на хосте, но без установки узла и т. д. Поэтому я запускаю такой контейнер
docker run --rm -it -v $(pwd):/app node:17.8.0 bash
whoami
показывает, что я root в контейнере. Затем я запускаю эти команды в контейнере
cd /app
npx create-next-app@latest
и получить этот вывод
Need to install the following packages:
create-next-app@latest
Ok to proceed? (y) y
sh: 1: create-next-app: Permission denied
npm notice
npm notice New minor version of npm available! 8.5.5 -> 8.6.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.6.0
npm notice Run npm install -g npm@8.6.0 to update!
npm notice
Я не понимаю, почему мне отказывают в доступе, так как я root.
Это как-то связано с сопоставлением томов каталога хоста, потому что, если я запускаю контейнер без сопоставления томов, команда работает.
Разрешения в каталоге хоста выглядят так
drwxrwxr-x 2 hans hans 4096 Apr 9 10:35 .
drwxrwxr-x 11 hans hans 4096 Apr 9 10:21 ..
Почему он терпит неудачу и как я могу заставить его работать?
Это правда. Я просто chown
на хосте после того, как файлы были созданы. Странно то, что запуск его с моим UID/GID фактически решает проблему. Я не понимаю, почему это имеет значение, но если вы измените свой комментарий на ответ, я приму его.
Возможно, это связано с такими вещами. docs.docker.com/engine/security/userns-remap. Я мало что знаю об этом, но я знаю, что есть несколько способов переназначить идентификаторы. Иногда все сдвигается вверх на фиксированное число.
Эта ошибка звучит для меня так, как будто недавно установленный скрипт create-next-app
не имеет разрешения на выполнение, больше, чем любая проблема, связанная с идентификатором пользователя.
@DavidMaze Это происходит только тогда, когда я запускаю его в каталоге с отображением тома. Если бы это было из-за отсутствия разрешения на выполнение, я бы подумал, что он всегда будет терпеть неудачу, независимо от того, в каком каталоге он был запущен?
Я предлагаю сразу же запустить контейнер с правильным UID/GID, чтобы впоследствии вам не пришлось исправлять разрешения. Это также может решить первоначальную проблему.
docker run -u "$(id -u):$(id -g)" ...
даже если вы сделаете это с правами root, у вас потом возникнут проблемы с редактированием под своим пользователем. Лучше запускайте контейнер со своим uid
docker run -u "$(id -u):$(id -g)" ...