迁移后,Docker会覆盖Postgres + Rails structure.sql中的所有者/组/权限

时间:2018-10-29 05:02:49

标签: ruby-on-rails ruby postgresql docker docker-compose

我的Ruby on Rails application使用structure.sql文件而不是schema.rb文件,因为我们使用的是一些自定义Postgres结构,例如citext列和gin搜索向量。我们最近在本地开发环境中采用了Docker容器,并且几乎可以完美地工作,除非我们尝试添加新的数据库迁移。因为我们的Docker映像是作为root用户构建的,所以它以root用户身份运行数据库迁移,并且迁移完成后结构.sql已更改为root拥有,而我的本地用户甚至不再具有执行git的权限差异

我发现可以将docker-compose run--user标志一起使用来以我的本地用户而不是root用户身份运行迁移,但是然后出错了,因为映像本身仍然是root用户。 ,因此当以本地用户身份运行db:migrate时,可能不会破坏structure.sql权限,因此本地用户将无权访问我的数据库卷以实际进行所需的更改。这似乎可以通过以用户身份构建整个映像来解决,但是构建映像不支持whoami$(id -u)之类的命令,因此我无法以这种方式编写Docker文件对于我的其他开发人员将是可扩展的;我必须对UID和GID进行硬编码,并希望其他人都一样。

最接近答案的是this Medium post,但是环境变量方法似乎对我不起作用;即使在设置了环境变量的情况下构建映像之后,数据库卷似乎仍是作为根创建的。这种猜测是因为构建图像后,运行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

这向我暗示,该映像仍是作为根目录构建的,因为我确实至少信任这两个命令中的第一个以本地用户身份运行。我怀疑我的Docker文件中至少需要一个ADDUSER命令,但是问题似乎可能更广泛。

我的背景是Rails,而不是Docker,而且我的内心深处还挺不错的。当然,这不是第一次有人看到它-那里的任何Rails开发人员都可以使用db:migrate和模式文件来与Docker容器一起玩吗?我在我认识的使用Rails + Docker的一家公司中与朋友ping通,他们已经看到了问题,但没有解决方案。

代码参考:my Dockerfilemy docker-compose file

0 个答案:

没有答案