一台服务器系统为:Ubuntu 18.04 LTS,上面建了git裸仓库,用于开发吧代码push到这里。同时WEB测试环境通过docker也部署在这台。通过git钩子post-receive,当有新代码提交是,就自动将最新的代码checkout到web测试目录,然后在手动重启容器,让java程序生效。由于代码更新频繁,手动重启太麻烦,就在git钩子post-receive脚本里增加了docker-compose restart的代码,然后提交代码是就会出现下面的错误:
- remote: Couldn't connect to Docker daemon at http+docker://localunixsocket - isit running?
- remote: If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
post-receive的脚本如下:
- #!/bin/sh
- WEBDIR=/data/webroot
- /usr/bin/git --work-tree=${WEBDIR} clean -fd
- /usr/bin/git --work-tree=${WEBDIR} checkout --force
- #sudo chown -R www:www ${WEBDIR}
- /usr/bin/docker-compose -f /docker-tomcat/docker-compose.yml restart
初看那个错误是提示docker-compose连不上docker daemon,连接docker daemon有两种方式,一种是通过TCP协议,一种是通过unixsocket。docker默认是通过unixsocket来通信的。
我在/var/run目录下找到了docker.sock文件:

原来这个文件的只有root用户和docker组用户可以访问,而我的git钩子是在git账号下运行的,于是:
把git用户加入到docker组,再次提交更行代码,容器可以自动重启了。
还有一种方法是修改docker daemon使用TCP协议启动:
- find / -name docker.service
使用find找到docker.service 文件 /lib/systemd/system/docker.service
- vim /lib/systemd/system/docker.service
在 ExecStart=/usr/bin/dockerd 后面加入 -H tcp://127.0.0.1:4243,保存后
- systemctl daemon-reload
- systemctl restart docker.service
重启docker daemon,通过ss可以看到已经监听4243端口
- root@docker:/# ss -atol
- State Recv-Q Send-Q Local Address:Port Peer Address:Port
- LISTEN 0 128 127.0.0.1:4243 0.0.0.0:*
- LISTEN 0 128 127.0.0.53%lo:domain 0.0.0.0:*
- LISTEN 0 128 0.0.0.0:28022 0.0.0.0:*
- LISTEN 0 5 127.0.0.1:ipp 0.0.0.0:*
- LISTEN 0 128 [::]:28022 [::]:*
- LISTEN 0 5 [::1]:ipp [::]:*
同时需要设置环境变量$DOCKER_HOST。
- $vim ~/.bashrc
- export DOCKER_HOST=tcp://localhost:4243
这样就可以了