我有一个自动部署系统,工作流程大概是这样的:
当我有一个新的想法,会在系统中新建一个项目,系统会为这个项目创建一个测试环境和一个生产环境,并且会生成一个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到仓库。用root执行git命令后,会产生很多所属者为root的文件,导致www-data用户和git用户无权读写。一旦用root用户执行过git命令,需要修改文件所有者:
chown -R www-data:www-data folder_name
使用第三方仓库,这样操作代码必须通过API,去掉了git用户,可以使问题稍稍简化一点,只需要注意root用户就行了。当初自己建立git仓库是因为github在海外,总是拉取失败。目前国内可供选择的仓库有: