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_.-]”。 p>
重要的是要知道三种类型的挂载:
- 卷存储在由 docker 管理的主机文件系统的一部分中(linux 上为
/var/lib/docker/volumes/
)。非 docker 进程不应修改文件系统的这一部分。卷是在 docker 中保存数据的最佳方式。 - 绑定安装可以存储在主机系统上的任何地方。它们甚至可能是重要的系统文件或目录。 docker 主机或 docker 容器上的非 docker 进程可以随时修改它们。
tmpfs
挂载仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统。
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
升级到 github.com/testcontainers/[电子邮件受保护]
后,可以使用以下方式指定绑定安装:
Mounts: testcontainers.Mounts(
testcontainers.BindMount(path, "/docker-entrypoint-initdb.d"),
),
以上就是无法在go中为docker容器写入有效的挂载路径的详细内容,更多请关注编程网其它相关文章!