Ответ 1
После некоторого опыта работы с контейнерами "dockerized" node я предлагаю другой подход.
Чтобы достичь вашей цели, мы рассмотрим другой подход, в котором я считаю лучшей практикой, поскольку он решает проблему и некоторые другие неуправляемые проблемы.
Разный подход
Скрипты пакетов предназначены для запуска javascript, установленного из зависимостей или из содержимого пакета. Файл package.json
должен иметь только входы вашего приложения node, не в ваш контейнер докеров.
Теперь у вас будет отдельный файл bash, который вы запускаете, чтобы запустить node в "докционированной среде". Пока package.json
запускает ваши файлы node.
Изображение докера будет содержать в своих заключительных строках что-то похожее на следующее:
ENTRYPOINT ["yarn"]
CMD [ "start" ]
Поскольку перед запуском изображения выполняются дополнительные действия (запуск mkdir
локально), вы можете запустить bash ./start-docker.sh
из командной строки, чтобы запустить script, а не через пряжу.
Изображение docker будет запускать ваши сценарии
package.json
, а не наоборот.
Вот некоторые из дополнительных преимуществ от того, что ваш докер отделен от package.json
:
-
Вы избавляетесь от проблем с разрешениями, так как запуск bash напрямую позволит ему создавать файлы и делать то, что пользователь, который его запускал, имеет.
-
Он позволяет пользователям без докеров получать доступ к вашему приложению node с помощью сценариев
package.json
, как они используются. -
Это позволяет пользователям докеров понять, что делает изображение докеров, поскольку в итоге он будет запускать
package.json
script после процесса настройки. Он также позволяет изменять вход без изменения файлов bash или докеров. -
Докеры
CMD
могут быть изменены во время выполнения для запуска разных сценариев пакетов, отличных отstart
(например,test
и т.д.). -
Удалите зависимость докера для запуска проекта, это важно, потому что докер не устанавливается через
yarn install
, делая пакет "нереальным" пакетом как таковым.
Почему пряжа требует разрешений
Основная проблема - Не в пряже. Он находится в вызове ("bash ./start-docker.sh"
vs "./start-docker.sh"
).
Запуск ./start-docker.sh
потребует sudo-разрешений, независимо от того, работает ли он через пряжу или нет. Пряжа не делает никаких трюков в изменении пользователей или таких.
"scripts": {
"start": "bash ./start-docker.sh",
...
}
Добавление bash
upfront решит проблему. Опять же, я действительно не рекомендую это решение. Разделите докеры с package.json
.
Подробные сведения для заинтересованных лиц:
Для ./start-docker.sh
требуются исполняемые и считываемые биты, тогда как bash ./start-docker.sh
требуется только считываемый бит. биты исполнения требуют разрешений.
Вы можете прочитать об этом здесь.