在继续调试 GO 代码之前,需要在容器内做一些“非熟练劳动”,以确保满足先决条件:
- samba 客户端已安装并且守护程序正在运行;
- 目标名称被解析;
- 没有连接问题(路由、防火墙规则等);
- 有共享访问权限;
- 容器允许安装远程卷。
连接到容器:
$ docker ps
$ docker exec -it container_id /bin/bash
Samba 守护进程正在运行:
$ smbd status
$ nmbd status
您在代码和命令行中使用正确的名称格式:
UNC notation => \\server_name\share_name
URL notation => smb://server_name/share_name
目标名称是可解析的
$ nslookup server_name.domain_name
$ nmblookup netbios_name
$ ping server_name
Samba 共享可见
$ smbclient -L //server [-U user] # list of shares
并且可访问(ls、get、put 命令在此处提供预期输出)
$ smbclient //server/share
> ls
尝试按照@cwadley 的建议挂载远程共享(Docker 容器中默认禁止挂载):
$ sudo mount -t cifs -o username=geeko,password=pass //server/share /mnt/smbshare
出于调查目的,您可以使用GitHub 提供的 Samba docker 容器,或者甚至在其中部署您的应用程序,因为它包含 Samba 客户端和有用的命令行工具:
$ sudo docker run -it -p 139:139 -p 445:445 -d dperson/samba
在 Docker 级别完成这项工作后,您可以轻松地在 Kubernetes 中重现它。
您可以在 Kubernetes 中运行的 Pod 中进行检查:
$ kubectl get deployments --show-labels
$ LABEL=label_value; kubectl get pods -l app=$LABEL -o custom-columns=POD:metadata.name,CONTAINER:spec.containers[*].name
$ kubectl exec pod_name -c container_name -- ping -c1 server_name
在 Docker 和 Kubernetes 的命令行中运行后,您的程序代码也应该可以运行了。
此外,关于 Samba 主题的 StackOverflow 上还有一个非常周到的讨论:
Mount SMB/CIFS share within a Docker container