Разрешения на созданные каталоги с использованием пряжи

Я пытался настроить команду с помощью Пряжи, чтобы создавать каталоги, создавать мои изображения Docker и запускать docker-compose up.

Я добавил start script в мой package.json для выполнения оболочки script:

"scripts": {
  "start": "./start-docker.sh",
  ...
}

Это start-docker.sh:

#!/bin/bash

mkdir -p volumes/mysql volumes/wordpress

docker-compose build

docker-compose up

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

Затем я добавил эту строку после создания каталогов, чтобы предоставить полные разрешения для контейнеров:

sudo chmod -R 777 volumes

Но, как вы можете видеть, эта команда должна выполняться с использованием sudo. Это означает, что выполнение команды yarn start требует пароля, чего я не хотел.

Я избавился от оболочки script и использовал только пряные скрипты:

"scripts": {
  "prestart": "mkdir -p volumes/mysql volumes/wordpress && docker-compose build",
  "start": "docker-compose up",
  ...
}

Удивительно, но это сработало, но я не понимаю, почему.. у вас есть идеи?

Ответ 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 требуется только считываемый бит. биты исполнения требуют разрешений.

Вы можете прочитать об этом здесь.