GoLang的postgres testcontainers初始化脚本不起作用。

huangapple go评论78阅读模式
英文:

GoLang postgres testcontainers init script doesn't work

问题

我想要使用初始化脚本启动postgres容器。

request := testcontainers.ContainerRequest{
	Image:      "postgres:14.1-alpine",
	Entrypoint: nil,
	Env: map[string]string{
		"POSTGRES_DB":       "postgres",
		"PGUSER":            "postgres",
		"POSTGRES_PASSWORD": "postgres",
		//"PGDATA":            "postgres",
	},
	ExposedPorts: []string{"5432"},
	BindMounts: map[string]string{
		"/media/mihovelgod/Новый том1/GoProjects/microservices/sql/go-sql/resources/migrations": "/docker-entrypoint-initdb.d",
	},
	Name:       "postgres",
	User:       "postgres",
	WaitingFor: wait.ForLog("database system is ready to accept connections"),
	AutoRemove: true,
}
container, err = testcontainers.GenericContainer(
	test.CTX,
	testcontainers.GenericContainerRequest{
		ContainerRequest: request,
		Started:          true,
	},
)
if err != nil {
	log.Panicln(err)
}

我在log.Panicln(err)中得到了以下错误信息:

failed to create container
Error response from daemon
invalid mount config for type "bind": bind source path does not exist: /docker-entrypoint-initdb.d

问题是它在docker-compose.yml中完美地工作。如何修复这个问题?

英文:

I want to start postgres container with init script.

request := testcontainers.ContainerRequest{
		Image:      "postgres:14.1-alpine",
		Entrypoint: nil,
		Env: map[string]string{
			"POSTGRES_DB":       "postgres",
			"PGUSER":            "postgres",
			"POSTGRES_PASSWORD": "postgres",
			//"PGDATA":            "postgres",
		},
		ExposedPorts: []string{"5432"},
		BindMounts: map[string]string{
			"/media/mihovelgod/Новый том1/GoProjects/microservices/sql/go-sql/resources/migrations": "/docker-entrypoint-initdb.d",
		},
		Name:       "postgres",
		User:       "postgres",
		WaitingFor: wait.ForLog("database system is ready to accept connections"),
		AutoRemove: true,
	}
container, err = testcontainers.GenericContainer(
		test.CTX,
		testcontainers.GenericContainerRequest{
			ContainerRequest: request,
			Started:          true,
		},
	)
	if err != nil {
		log.Panicln(err)
	}

I got the following panic messages in log.Panicln(err):

failed to create container
Error response from daemon
invalid mount config for type "bind": bind source path does not exist: /docker-entrypoint-initdb.d

The point is that it perfectly works from docker-compose.yml.
How to fix this?

答案1

得分: 2

看起来,根据源代码,TestContainers希望在BindMounts中使用container_path: host_path的形式。如果你尝试以下代码会发生什么:

        BindMounts: map[string]string{
             "/docker-entrypoint-initdb.d": "/media/mihovelgod/Новый том1/GoProjects/microservices/sql/go-sql/resources/migrations",
        },

看起来,TestContainers的更新版本已经完全移除了BindMounts,并用一个更通用的Mounts字段来替代。

英文:

Looking at the source, it appears that TestContainers wants container_path: host_path in BindMounts. What happens if you try:

        BindMounts: map[string]string{
             "/docker-entrypoint-initdb.d": "/media/mihovelgod/Новый том1/GoProjects/microservices/sql/go-sql/resources/migrations",
        },

It looks like more recent versions of TestContainers have removed BindMounts completely and replaced it with a more generic Mounts field.

huangapple
  • 本文由 发表于 2022年2月1日 06:12:01
  • 转载请务必保留本文链接:https://go.coder-hub.com/70933442.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定