一台服務器系統為: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賬號下運行的,於是:
usermod -aG docker 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
這樣就可以了