【问题标题】:Defining a mount point for volumes in GoLang Docker SDK在 GoLang Docker SDK 中为卷定义挂载点
【发布时间】:2018-01-26 22:00:16
【问题描述】:

我目前正在尝试使用官方 GoLang Docker SDK 创建一个 Docker 容器,并尝试将一个卷从我的 localhost 挂载到 docker 容器。

vol := map[string]struct{}{"/pathInDocker":{}}

// This was prepared using example at:
//https://docs.docker.com/develop/sdk/examples/#run-a-container
res, err := cli.ContainerCreate(ctx, &container.Config{
    Image: testImageName,
    Volumes: vol,
    Cmd: []string{"ls", "/"},
}, nil, nil, "")

这适用于创建容器并将“/pathInDocker”添加到 docker 容器,但是,我不知道如何为 localhost 添加挂载点。

我已经为 vol 变量尝试了以下可能的值

vol := map[string]struct{}{"localPath:/pathInDocker":{}}
vol := map[string]struct{}{"\"localPath\":\"/pathInDocker\"":{}}

对于这些中的每一个,生成的 docker 容器会尝试将映射键作为 docker 中的文件夹挂载,而不是 localhost 的挂载点。

我翻阅了文档,似乎唯一能找到的关于如何配置卷的内容就是这一行:

Volumes         map[string]struct{} // List of volumes (mounts) used for the container

所以我的问题是如何配置它以便将本地文件夹安装到卷?

【问题讨论】:

    标签: docker go


    【解决方案1】:

    如果您想使用绑定挂载,您需要在 HostConfig 中提供您的挂载信息。

    res, err := client.ContainerCreate(
        ctx,
        &container.Config{
            Image: "nginx",
            Cmd:   []string{"ls", "/"},
        },
        &container.HostConfig{
            Mounts: []mount.Mount{
                {
                    Type:   mount.TypeBind,
                    Source: "/localPath",
                    Target: "/pathInDocker",
                },
            },
        },
        nil,
        "",
    )
    

    如果你想使用卷,首先你需要创建一个带有挂载路径的卷,然后你需要使用这个卷名作为源。

    【讨论】:

    • 这是绑定安装的绝佳答案,它确实回答了原始问题。但是对于像-v data:/var/www/html 这样的正常音量呢?
    • 我能够挂载一个 docker 卷,首先使用 VolumeCreate 创建它,然后在挂载数组中使用我的卷的名称,如 @aerokite 建议:myMount := mount.Mount{Type: volume.TypeVolume Source: myVolume.Name Target: "/var/lib/postgresql/data"}
    • @TomMertz,拯救了我的一天。请注意,它应该是Type: mount.TypeVolume 而不是Type: volume.TypeVolume
    【解决方案2】:

    accepted answer 非常适用于目录,但不适用于单个文件。它最终将文件挂载为容器even if the file exists on the host 内的目录。检查它在 Docker CLI 中的工作方式,它使用 Binds 而不是 Mounts,然后 Mounts 最终会自动填充。这是在 Go 代码中挂载单个文件的样子:

    res, err := client.ContainerCreate(
        ctx,
        &container.Config{
            Image: "nginx",
            Cmd:   []string{"ls", "/"},
        },
        &container.HostConfig{
            Binds: []string{
                "/localPath:/pathInDocker",
            },
        },
        nil,
        "",
    )
    

    【讨论】:

      猜你喜欢
      • 2017-01-22
      • 1970-01-01
      • 2020-09-14
      • 2020-01-20
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多