1 背景描述
禅道使用docker部署运行过一段,服务正常。
后因服务器断电重启,禅道服务也随docker一起启动,但是服务却无法访问。如下如:
2 查看日志,定位原因
查看禅道日志:
# docker logs zentao容器di
docker logs e35d4b4d9f62
错误显示:In: failed to create symbolic link '/opt/zbox/tmp/mysql/mysql.sock': File exists
这个错误通常发生在容器启动过程中,尝试创建一个符号链接(symbolic link)时,但目标位置已经存在一个同名的文件(或目录)。
具体原因分析:
在 Docker 中运行禅道(Zentao)时出现 failed to create symbolic link '/opt/zbox/tmp/mysql/mysql.sock': File exists
错误,主要由以下原因导致:
-
残留文件冲突
-
当容器重启或重新创建时,如果宿主机通过
-v
挂载了持久化目录(如./zbox:/opt/zbox
),残留的mysql.sock
文件会保留在宿主机目录中。 -
容器启动时,MySQL 服务尝试创建新的
mysql.sock
符号链接,但旧文件已存在,导致冲突。
-
-
容器未正确清理
-
如果之前容器非正常退出(如强制终止
docker kill
),MySQL 未完成清理流程,导致mysql.sock
文件未被删除。
-
-
权限问题(次要可能)
-
挂载目录的权限不足,导致容器无法覆盖已有文件(但错误提示明确为
File exists
,优先级较低)。
-
为什么已经存在?
1.可能是由于之前的容器运行后异常退出,没有正确清理,导致该文件残留。
2.或者,在宿主机的卷挂载(volume mount)中,如果该目录被挂载到宿主机的一个目录,而宿主机目录中已经存在`mysql.sock`文件,那么容器启动时就会看到这个文件已经存在。
3 解决方案
方案1 : 删除容器内已存在的文件:/opt/zbox/tmp/mysql/mysql.sock
#进入容器
docker exec –it <container id or name> /bin/bash
# 查看文件
cd /opt/zbox/tmp/mysql
# 删除文件
rm mysql.sock
重启容器即可。
方案2:修改启动脚本
#进入容器
docker exec –it <container id or name> /bin/bash
#找到运行脚本
cd /etc/s6/s6-available/apache/
#修改脚本
vi run
#该禅道版本为18.5,修改第21行
原文: if [ -e /data/mysql/tmp/mysql.sock ];then
修改为:if [! -e /data/mysql/tmp/mysql.sock ];then
本质就是在-e前面加了一个感叹号取反。
保存文件并重启容器。
再次查看日志,如下图:
再次访问服务,服务能正常打开。如下图: