我正在尝试使用testcontainers运行一个容器。下面是我的代码:
func createContainer(ctx context.Context) (testcontainers.Container, *gorm.DB, string, error) {
var env = map[string]string{
"POSTGRES_PASSWORD": DbPass,
"POSTGRES_USER": DbUser,
"POSTGRES_DB": DbName,
}
var port = "5432/tcp"
path := `C:/Desktop/Folder/golang/TgBotReminder/internal/db/postgresql/migration/notes.sql`
req := testcontainers.GenericContainerRequest{
ContainerRequest: testcontainers.ContainerRequest{
Image: "postgres:latest",
ExposedPorts: []string{port},
Env: env,
WaitingFor: wait.ForLog("database system is ready to accept connections"),
SkipReaper: true,
Mounts: testcontainers.Mounts(
testcontainers.BindMount(path, "/docker-entrypoint-initdb.d"),
),
},
Started: true,
}
...
字符串
我在路径变量中提到的目录存在。但我得到了错误:Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /pipe/docker_engine: creating reaper failed: failed to create container
。即使我用挂载注解行也会得到这个错误。怎么修?在路径变量(“notes.sql”)中输入filename是否正确?还是我应该只在这里输入目录?
先谢谢你了
更新1
我现在也试了这个代码:
container, err := tspostgres.RunContainer(ctx,
testcontainers.WithImage("postgres:latest"),
tspostgres.WithInitScripts(filepath.Join(".", "test_migration", "notes.sql")),
tspostgres.WithDatabase("test-db"),
tspostgres.WithUsername("postgres"),
tspostgres.WithPassword("postgres"),
testcontainers.WithWaitStrategy(
wait.ForLog("database system is ready to accept connections").
WithOccurrence(2).WithStartupTimeout(5*time.Second)),
)
if err != nil {
log.Fatal(err)
}
型
得到相同的错误
更新2
下面是我尝试过的另一段代码:
path := `/${PWD}/desktop/folder/golang/tgbotreminder/internal/db/postgresql/migration/notes.sql`
target := "/docker-entrypoint-initdb.d/"
...
Mounts: testcontainers.ContainerMounts{
testcontainers.ContainerMount{
Source: testcontainers.GenericBindMountSource{
HostPath: path,
},
Target: testcontainers.ContainerMountTarget(target),
},
},
型
没有运气了:(
更新3
以下是我的另一个尝试:
Mounts: testcontainers.Mounts(testcontainers.ContainerMount{
Source: testcontainers.GenericBindMountSource{
HostPath: path,
},
Target: testcontainers.ContainerMountTarget(target),
}),
型
它也不工作
4条答案
按热度按时间relj7zay1#
问题似乎是图像
Ryuk
和一些与windows
不兼容的硬编码值。testcontainers-go目前不支持“Windows容器”:它有一些硬编码的默认值,不考虑Windows容器的可能性。
参见https://github.com/testcontainers/testcontainers-go/issues/948
jtw3ybtb2#
我在我的机器上遇到了同样的问题。完整的错误消息是:
字符串
正如@pratheesh-pc所指出的,这意味着它无法从图像
docker.io/testcontainers/ryuk:0.5.1
创建容器。它与您要创建的自己的容器的挂载配置无关。我认为@pratheesh-pc的答案中提供的链接是针对Windows上的Windows容器(WCOW)的,但我在Windows上运行Linux容器(LCOW)时遇到了这个问题。解决方法是禁用收割器。实际上,您已经在代码中设置了
SkipReaper: true
,并且您打算禁用reaper。问题是,从github.com/testcontainers/testcontainers-go@v0.20.0,SkipReaper
被完全忽略,您必须使用以下方法之一禁用它:1.将
ryuk.disabled=true
添加到.testcontainers.properties
文件。在Windows上,文件的完整路径是C:/Users/%my_username%/.testcontainers.properties
。1.设置
TESTCONTAINERS_RYUK_DISABLED=true
环境变量此方式优先于属性文件。dxpyg8gm3#
问题似乎在于坐骑的尝试:
字符串
当指定绑定挂载的源路径时,应该提供文件的完整路径,包括文件名本身。因此,在路径变量中包含文件名(“notes.sql”)是正确的。
lpwwtiir4#
已解决
在
C:/Users/%my_username%/
中创建了一个文件.testcontainers.properties
,并在那里写道:ryuk.disabled=true
个