文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

无法在go中为docker容器写入有效的挂载路径

2024-02-11 14:31

关注

php小编子墨发现,有一些开发者在使用Go语言编写docker容器时遇到了一个问题,即无法为容器写入有效的挂载路径。这个问题可能导致在容器中进行文件读写操作时出现错误或失败。对于开发者来说,这无疑是一个令人沮丧的困扰。接下来,我们将探讨这个问题的原因以及可能的解决方案,帮助开发者解决这个挑战。

问题内容

我正在尝试启动一个测试容器来测试我的数据库。我正在使用测试容器。 这是我如何设置容器的一段代码:

func createContainer(ctx context.Context) (testcontainers.Container, *pgxpool.Pool, string, error) {
var env = map[string]string{
        "POSTGRES_PASSWORD": DbPass,
        "POSTGRES_USER":     DbUser,
        "POSTGRES_DB":       DbName,
    }
    var port = "5432/tcp"

    // /Users/:/ 
    path := `/c/Users/pizhlo21/Desktop/Folder/golang/TgBotReminder/internal/db/postgresql/migration:/usr/app`

    req := testcontainers.GenericContainerRequest{
        ContainerRequest: testcontainers.ContainerRequest{
            Image:        "postgres:latest",
            ExposedPorts: []string{port},
            Env:          env,
            WaitingFor:   wait.ForLog("database system is ready to accept connections"),
            VolumeMounts: map[string]string{"/docker-entrypoint-initdb.d": path},
            SkipReaper: true,
        },
        Started: true,
    }
    container, err := testcontainers.GenericContainer(ctx, req)
    if err != nil {
        return container, nil, "", fmt.Errorf("unable to start container: %v", err)
    }
...

但我从 docker 收到错误: failed to setup testunable to start container: failed to create container: error response from daemon: create /docker-entrypoint-initdb.d: "/docker-entrypoint-initdb.d" 包括本地卷名称的无效字符,仅允许“[a-za-z0-9][a-za-z0-9_.-]”。如果您打算传递主机目录,请使用绝对路径

有时此错误如下所示:无法设置测试无法启动容器:无法创建容器:守护程序的错误响应:“卷”类型的安装配置无效:安装路径无效:'“c” /desktop/folder/golang/tgbotreminder/internal/db/postgresql/migration/000001_init_schema.up"' 挂载路径必须是绝对

我尝试了许多不同的路径,例如:

//c/用户/... c/用户/... /%cd%/桌面/... $home/桌面/文件夹/...

但没有任何帮助我。

如何正确执行?

解决方法

tl;dr

替换

volumemounts: map[string]string{"/docker-entrypoint-initdb.d": path},

bindmounts: map[string]string{"/docker-entrypoint-initdb.d": path},

问题 1

“/docker-entrypoint-initdb.d”包含本地卷名称的无效字符,仅允许“[a-za-z0-9][a-za-z0-9_.-]”。

重要的是要知道三种类型的挂载:

volumemounts 用于指定卷挂载。从 github.com/testcontainers/[email protected] 的值volumemounts 中的条目存储卷名称,该条目仅允许 [a-za-z0-9][a-za-z0-9_.-],这就是您看到错误消息的原因。顺便说一句,要看到上面的错误消息,您的代码必须是这样的(请注意 /docker-entrypoint-initdb.d 是值而不是键):

volumemounts: map[string]string{path: "/docker-entrypoint-initdb.d"},

问题 2

类型“volume”的挂载配置无效:挂载路径无效:“c/desktop/folder/golang/tgbotreminder/internal/db/postgresql/migration/000001_init_schema.up”挂载路径必须是绝对的

要查看此错误消息,您的代码必须如下所示:

volumemounts: map[string]string{`"/c/desktop/folder/golang/tgbotreminder/internal/db/postgresql/migration/000001_init_schema.up"`: "/docker-entrypoint-initdb.d"},

作为github.com/testcontainers/ volumemounts 中条目的键存储挂载路径。由于挂载路径包含双引号("),因此它是无效的。docker 守护进程首先验证挂载路径。这就是您看到错误消息的原因。

考虑升级 github.com/testcontainers/testcontainers-go

在版本v0.13.0中,containerrequest.bindmountscontainerrequest.volumemounts 替换为 containerrequest.mounts。这是因为“基于映射的数据结构在某种程度上令人困惑。此更改通过为所有组件引入专用类型以获得 ide 和编译器的帮助来避免混乱”。 (请参阅 pr#386)。

升级到 github.com/testcontainers/[电子邮件受保护] 后,可以使用以下方式指定绑定安装:

Mounts: testcontainers.Mounts(
    testcontainers.BindMount(path, "/docker-entrypoint-initdb.d"),
),

以上就是无法在go中为docker容器写入有效的挂载路径的详细内容,更多请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯