Docker db容器正在运行,另一个进程与pid< id>是使用unix套接字文件

yebdmbv4  于 2023-05-16  发布在  Docker
关注(0)|答案(6)|浏览(129)

我正在尝试运行一个docker mysql容器,并根据此消息https://stackoverflow.com/a/29150538/6086816中提供的指令初始化db。第一次运行后,它工作正常,但在第二次运行时,在尝试从脚本执行/usr/sbin/mysqld后,我得到这个错误:
db_1| 2016-03- 19 T14:50:14.819377Z 0 [ERROR]另一个pid为10的进程正在使用unix socket文件。
db_1| 2016-03- 19 T14:50:14.819498Z 0 [ERROR]无法设置unix套接字锁定文件。
...
mdir_db_1已退出,代码为% 1
是什么原因呢?

fnvucqvd

fnvucqvd1#

我也面临着同样的问题。以下是我试图解决这个问题的步骤-

  • 首先,使用以下命令停止你的docker服务-“sudo service docker stop”
  • 现在,使用以下路径进入我的Linux系统中的docker文件夹- /var/lib/docker。
  • 然后在docker文件夹中,你需要进入volumes文件夹。此文件夹包含您所有容器的卷(每个容器的内存)- cd /volumes
  • 进入卷后,执行'sudo ls',您将发现多个具有哈希名称的文件夹。这些文件夹是容器的卷。每个文件夹都以其哈希值命名(您需要检查您的docker容器并获取容器卷的哈希值。为此,您需要执行以下步骤-

运行命令“docker inspect 'your container ID'“。
你会得到一个JSON文件。它是你的docker容器的配置文件。
搜索此JSON文件中的Mounts键。在Mounts中,您将获得卷的名称(哈希)。(您还将在挂载中获得卷的路径。在Mounts中,“Name”键是您的卷名,“Source”是您的卷所在的路径。

  • 一旦你得到你的卷的名称,你可以在你的卷文件夹,并在此文件夹中,你会发现“_data”文件夹。进入这个文件夹。
  • 最后,在“_data”文件夹中使用sudo ls命令,您将找到一个名为mysql. sock. lock的文件夹。删除此文件夹通过“rm-fmysql.sock.lock”。
  • 现在重启你的docker服务,然后启动你的docker容器。它会开始工作。
    **注意-**在docker容器文件夹中,每个命令都使用sudo。
oprakyz7

oprakyz72#

在启动mysql之前,你应该确保socket文件已经被删除。检查我的.cnf(/etc/mysql/my.cnf)文件,以获得socket文件的路径。找到像这样的socket = /var/run/mysqld/mysqld.sock。并删除.sock.lock文件。

2cmtqfgy

2cmtqfgy3#

只是面临同样的问题。
经过多次研究,总结了我的解决方案:
1.查找docker文件的主机位置
$ docker inspect <container_name>--> * 装载源 * 部分

在我的例子中,它是 /var/snap/docker/common/.../_data
作为 root,您可以ls -l该目录并查看阻止容器启动的文件,即套接字 mysql.sock 和文件 mysql.sock.lock

只需将它们删除为 root$ sudo rm /var/snap/.../_data/mysql.sock*)并启动docker容器。

**注意:**确保除了这两个文件之外,您没有任何其他的 * mysql.sock... * 文件。在这种情况下,不要使用wildcar(*),单独删除它们。

希望这能帮上忙。

dfuffjeb

dfuffjeb4#

我也遇到了同样的问题,并以一种轻松而神秘的方式摆脱了它。
首先,我注意到我无法启动mysql_container容器。运行docker logs mysql_container表明与所述重复几次完全相同的问题。
我想通过在一个bash窗口中以交互模式运行docker start -i mysql_container容器,同时在另一个窗口中运行docker exec -it mysql_container cat /etc/mysql/my.cnf之类的东西来查看一下。
我已经这样做了,非常惊讶地看到,这一次容器启动成功。我不明白为什么。我只能猜测,启动一个交互模式并运行随后的docker exec命令会减慢init进程的速度,而另一个进程有更多的时间来删除它的锁。
希望这对大家有帮助。

qzlgjiam

qzlgjiam5#

这是Docker的一个漏洞。
执行以下命令:

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

这将停止所有容器并将其删除。
在这之后,它应该工作得很好。

lymgl2op

lymgl2op6#

通常,这意味着之前运行的MySQL示例通过文件系统锁定了DB。
如果您确定没有示例正在运行,则可以删除剩余的悬挂锁,并且不会出现冲突错误。
根据shubham tak's answer,您可以通过直接从主机计算机的文件系统中删除这些锁来删除Docker虚拟文件系统上持久化的锁。
或者,您可以使用Docker CLI将其全部删除并重新开始:

docker system prune
docker volume prune

然后再试一次。

相关问题