[英]Unable to mount a folder in Docker from container with Go Docker Engine API
我正在尝试使用 Go Docker 引擎 ZDB974238714CA8DE634A7CE1D08 在容器内运行 docker。 我能够将一个文件夹从主机系统安装到容器,但只有空目录被复制到容器内的 docker 中。 如果有任何替代方法,请帮助我。 我正在使用以下命令启动我的容器。
docker 运行 --rm -v C:\Users\user\source\repos\game:/app/myrepo -v /var/run/docker.sock:/var/run/docker.sock testimage
附上一段代码。 Go Docker SDK 代码启动容器
resp, err := cli.ContainerCreate(ctx, &container.Config{
Image: "hello-image",
Cmd: []string{"ls"}, #the actual cmd would look different
Tty: true,
}, &container.HostConfig{
Binds: []string{
"/app/myrepo:/myrepo",
},
}, nil, nil, containername)
if err != nil {
panic(err)
}
更新了与绝对路径绑定的代码
resp, err := cli.ContainerCreate(ctx, &container.Config{
Image: "hello-image",
Cmd: []string{"ls"}, #the actual cmd would look different
Tty: true,
}, &container.HostConfig{
Mounts: []mount.Mount{
{
Type: mount.TypeBind,
Source: "/app/myrepo",
Target: "/myrepo",
},
},
}, nil, nil, containername)
if err != nil {
panic(err)
}
正如评论中所讨论的,OP 正在容器中运行应用程序。 该应用程序正在连接到主机上的 docker 守护程序(通过共享/var/run/docker.sock
)并尝试创建容器。 问题是请求包含一个挂载点,源是/app/myrepo
,它是一个在容器内有效但在主机上无效的源路径。
为了帮助理解为什么这是一个问题,您需要考虑如何提出 API 请求。 您的代码将生成一个 JSON 格式的请求; 这将包括以下内容:
...
"HostConfig": {
...
"Mounts": [
{
"Source": "/app/myrepo",
"Destination": "/myrepo",
}
]
}
重要的是要注意Source
路径作为字符串传递,Docker 守护程序将在主机(例如 windows 框)上下文中解释这一点。 当它试图定位请求的路径 ( /app/myrepo
) 时,它不会找到它,因为该路径在主机上不存在。 要更正此问题,您需要发送有效路径,例如
Mounts: []mount.Mount{
{
Type: mount.TypeBind,
Source: "c:/Users/user/source/repos/game",
Target: "/myrepo",
},
}
一个注意事项; 以这种方式访问 Docker API (绑定挂载/var/run/docker.sock:
)很方便,但如果有人获得对容器的访问权限,那么他们也可以获得对所有容器的完全控制权(因为他们可以访问 ZC5FD214CDD22E3B4B27 API)。 您可能需要考虑使用代理(例如)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.