macOS环境下如何正确将Unix套接字挂载到运行中的Docker容器
解决方案
你所描述的场景可以使用SSH_AUTH_SOCK的变通方案解决该问题,核心原理是Docker for Mac为支持SSH代理转发,对SSH_AUTH_SOCK路径的Unix套接字做了专门的透传处理,不会触发普通共享目录下Unix套接字无法访问的限制。
具体操作步骤
- 主机侧确认SSH_AUTH_SOCK路径
执行命令查看本地SSH_AUTH_SOCK的实际路径:echo $SSH_AUTH_SOCK
通常路径格式为/run/user/[用户UID]/keyring/ssh或~/.ssh/ssh_auth_sock。如果当前不需要使用本机SSH代理功能,可以临时替换该路径的监听套接字,用完后恢复即可。 - 主机侧做套接字转发
用socat将Cloud SQL Proxy生成的PostgreSQL套接字转发到SSH_AUTH_SOCK路径:
socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork UNIX-CONNECT:/var/run/cloudsql/myproject:region:instance/.s.PGSQL.5432
- 启动容器并连接
启动容器时添加SSH转发参数,直接使用容器内默认挂载的SSH_AUTH_SOCK路径访问即可:
docker run \ --ssh default \ --entrypoint /bin/bash \ "postgres:latest" \ -c ' \ /usr/bin/apt update -y && \ /usr/bin/apt install socat postgresql-client -y && \ # 测试连接 socat - UNIX-CONNECT:$SSH_AUTH_SOCK # 若要使用psql连接,直接指定host为套接字所在目录即可 # psql "host=$(dirname $SSH_AUTH_SOCK) user=你的IAM用户名 dbname=目标数据库名" '
备选方案(TCP中转,无需改动SSH_AUTH_SOCK)
如果不想影响原有SSH代理的使用,可以用TCP端口中转绕开Unix套接字挂载限制:
- 主机侧将Unix套接字转发到本地TCP端口:
socat TCP-LISTEN:15432,bind=127.0.0.1,fork UNIX-CONNECT:/var/run/cloudsql/myproject:region:instance/.s.PGSQL.5432
- 容器内直接通过
host.docker.internal:15432访问数据库即可,无需挂载任何目录。
补充说明
你之前直接挂载单个套接字报错,是因为路径中的冒号被Docker的-v参数识别为路径分隔符,20.10及以上版本的Docker可以用--mount参数规避该语法问题,但依旧无法解决Docker for Mac普通共享目录下Unix套接字无法访问的底层限制,因此不推荐该方案。
内容的提问来源于stack exchange,提问作者red888
相关产品推荐
相关产品推荐

