My Приложение Ruby on Rails использует файл struct.sql вместо файла schema.rb, так как мы используем некоторые пользовательские структуры Postgres, такие как столбцы citext и векторы поиска джина. Недавно мы приняли контейнеры Docker для нашей локальной среды разработки, и она отлично работает * , за исключением случаев, когда мы пытаемся добавить новые миграции баз данных. Поскольку наш образ Docker был создан как пользователь root, он выполняет миграцию базы данных от имени пользователя root, и после завершения миграции структура.sql перешла в собственность root, и мой локальный пользователь больше не имеет даже разрешения делать git дифф.
Я обнаружил возможность использовать docker-compose run
с флагом --user
для запуска миграции в качестве локального пользователя вместо пользователя root, но это приводит к ошибкам, поскольку само изображение все еще создается как root, поэтому во время работы db:migrate
, поскольку мой локальный пользователь может не связываться с разрешениями struct.sql, локальный пользователь не будет иметь права доступа к тому в моей базе данных, чтобы действительно внести необходимые изменения. Казалось, что это можно исправить, собрав все изображение под моим пользователем, но создание изображения не поддерживает такие команды, как whoami
или $(id -u)
, поэтому я не могу записывать файлы Docker так, чтобы их можно было расширять для другие мои разработчики; Мне нужно было бы жестко указать свой UID и GID и надеяться, что все остальные будут такими же.
Самым близким к ответу, который я нашел, является этот пост в Medium , но подход к переменной среды, похоже, не сработал для меня; даже после создания образа с установленными переменными среды том базы данных, похоже, все еще создается как root. Это предположение объясняется тем, что после построения образа, запуск docker-compose run --user $(id -u):$(id -g) web
поднял это:
WARNING: The CURRENT_UID variable is not set. Defaulting to a blank string.
и обе эти команды или работающие CURRENT_UID=$(id -u):$(id -g) docker-compose run web
подняли это:
Errno::EACCES: Permission denied @ dir_initialize - /code/db/storage
Что подразумевает для меня, что образ по-прежнему создается как root, поскольку я доверяю, по крайней мере, первой из этих двух команд для выполнения в качестве локального пользователя. Я подозреваю, что как минимум мне понадобится команда ADDUSER
в моем файле Docker, но проблема, вероятно, будет более широкой, чем эта.
Мой опыт в Rails, а не в Docker, и я чувствую себя не в своей тарелке. Конечно, это не первый раз, когда кто-то видел это - какие-нибудь разработчики Rails получили файлы db: migrate и schema для удобного воспроизведения с контейнерами Docker? Я пинговал друзей в одной компании, которую я знаю, занимающейся Rails + Docker, и они увидели проблему без решения.
Ссылки на код: мой Dockerfile и мой файл Docker-compose .