我有一个自动部署系统,工作流程大概是这样的:
当我有一个新的想法,会在系统中新建一个项目,系统会为这个项目创建一个测试环境和一个生产环境,并且会生成一个git仓库。我写好代码push到这个仓库,代码会立刻部署到测试环境。当我测试好后,点击发布按钮,代码会发布到生产环境。
这些流程会涉及到linux上多个用户:nginx默认以www-data用户运行;git是以git用户登录;倘若出现异常我以root用户去解决。你可能会问为什么用root用户解决?因为www-data用户和git用户不能用SSH登录,所以即便不用root也会有其他的第三个用户。我不一定在哪个容器中操作,在所有容器中建立非root用户又很麻烦。docker-enter命令进入容器后默认就是root用户,即便有非root用户也会忘记切换。
现在问题来了,www-data用户创建的文件,git用户没有读写权限,git用户创建的文件,www-data用户没有读写权限。之前的解决方案是把git用户放到www-data用户组中,这样这两个用户的文件就可以相互读写了。但是我总不能把root用户也放到www-data用户组中吧,所以我尽量不用root用户操作。
但难免有某些及其特殊的情况,导致必须使用root用户处理。比如:
composer install
安装一个包,所以我在服务器上直接从仓库clone一份,操作完再push到仓库。出现权限问题的根本原因是,多个功能在同一个容器中实现。不同功能应该使用不同的用户,但是现在出现混乱。将不同的功能分开,每个容器只实现一种功能,微服务化。这样每个容器功能单一,就不会混乱了。
缺点是,多个功在不同的容器中实现,这些功能直接交互就得通过API实现,会增加很多写API的工作量。权衡之后还是觉得解耦最重要。
很多项目也是这个道理,把复杂的项目拆分成独立提供服务的微服务,每个项目的代码少了,框架就可以用简单的了,后续框架依赖啥的升级也不怕了。