免责声明:我并不是在寻找配置 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 文件变成了主机上的一个(空)目录!
将套接字文件移动到其自己的目录并将该目录安装到主机后,我获得了一些运气,在这种情况下它可以工作一次,但在容器重启后则无法工作。
答案1
问题是绑定安装是为了暴露一些东西主持人到容器中。因此,当您执行此操作时:
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
。