免责声明:我不是在寻找一种将MySQL / MariaDB配置为使用TCP连接的方法。我知道这种选择,问题不在于那方面。
我在将套接字文件从容器内部绑定到主机文件系统时遇到麻烦。我期望像这样的简单docker-compose条目可以工作:
volumes:
- /srv/docker/sockets/mariadb.container.sock:/var/run/mysqld/mysqld.sock
但这是行不通的。相反,我遇到了以下错误消息:
its_sql_dev | 190305 10:31:23 [ERROR] Can't start server : Bind on unix socket: Address already in use
its_sql_dev | 190305 10:31:23 [ERROR] Do you already have another mysqld server running on socket: /var/run/mysqld/mysqld.sock ?
主机系统中文件的状态似乎无关紧要-它是否已存在,是否具有a+rwx
权限,是否存在正确的用户或根本不存在,似乎对容器是否启动没有任何影响。
也许最令人困惑的是主机文件系统的最终结果:
[user@server mariadb]# ls -alsh /srv/docker/shared/
total 16K
4.0K drwxrwxrwx 4 root root 4.0K Mar 5 11:31 .
4.0K drwxr-xr-x 7 root root 4.0K Mar 1 13:09 ..
4.0K drwxr-xr-x 2 root root 4.0K Mar 5 11:31 mariadb.container.sock
原来,.sock文件变成了主机上的一个(空)目录!
将套接字文件移动到其自己的目录并将该目录安装到主机后,我还有一点运气。在这种情况下,该文件只能工作一次,但在容器重启后不会工作。
问题是绑定安装用于将主机上的某些内容暴露给容器。因此,当您执行此操作时:
volumes:
- /srv/docker/sockets/mariadb.container.sock:/var/run/mysqld/mysqld.sock
您正在试图安装/srv/docker/sockets/mariadb.container.sock
-这不存在-在/var/run/mysqld/mysqld.sock
容器内。由于源对象不存在,Docker将在该位置创建一个空目录并将其安装到容器中……这当然意味着mysqld在启动时无法创建套接字。
正确的解决方案是将主机目录挂载到/var/run/mysqld/
,例如:
volumes:
- /srv/docker/sockets/mariadb:/var/run/mysqld
然后在您的主机上,该套接字将变为/srv/docker/sockets/mariadb/mysqld.sock
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句