Create-next-app не работает при запуске в контейнере

Я хочу создать новое приложение 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 ..

Почему он терпит неудачу и как я могу заставить его работать?

даже если вы сделаете это с правами root, у вас потом возникнут проблемы с редактированием под своим пользователем. Лучше запускайте контейнер со своим uid docker run -u "$(id -u):$(id -g)" ...

The Fool 09.04.2022 10:54

Это правда. Я просто chown на хосте после того, как файлы были созданы. Странно то, что запуск его с моим UID/GID фактически решает проблему. Я не понимаю, почему это имеет значение, но если вы измените свой комментарий на ответ, я приму его.

Hans Kilian 09.04.2022 11:02

Возможно, это связано с такими вещами. docs.docker.com/engine/security/userns-remap. Я мало что знаю об этом, но я знаю, что есть несколько способов переназначить идентификаторы. Иногда все сдвигается вверх на фиксированное число.

The Fool 09.04.2022 11:15

Эта ошибка звучит для меня так, как будто недавно установленный скрипт create-next-app не имеет разрешения на выполнение, больше, чем любая проблема, связанная с идентификатором пользователя.

David Maze 09.04.2022 11:37

@DavidMaze Это происходит только тогда, когда я запускаю его в каталоге с отображением тома. Если бы это было из-за отсутствия разрешения на выполнение, я бы подумал, что он всегда будет терпеть неудачу, независимо от того, в каком каталоге он был запущен?

Hans Kilian 09.04.2022 12:10
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
5
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предлагаю сразу же запустить контейнер с правильным UID/GID, чтобы впоследствии вам не пришлось исправлять разрешения. Это также может решить первоначальную проблему.

docker run -u "$(id -u):$(id -g)" ...

Другие вопросы по теме