in wrappers/golang/pgadapter.go [597:677]
func startDocker(ctx context.Context, config Config) (pgadapter *PGAdapter, err error) {
if config.Port != 0 {
return nil, fmt.Errorf("only dynamic port assignment (Config.Port=0) is supported for Docker")
}
var credentialsFile string
if !config.ConnectToEmulator && config.CredentialsFile == "" {
credentials, err := google.FindDefaultCredentials(ctx)
if credentials == nil {
return nil, fmt.Errorf("credentials cannot be nil")
}
if credentials.JSON == nil || len(credentials.JSON) == 0 {
return nil, fmt.Errorf("only JSON based credentials are supported")
}
f, err := os.CreateTemp(os.TempDir(), "pgadapter-credentials")
if err != nil {
return nil, err
}
defer os.RemoveAll(f.Name())
if _, err = f.Write(credentials.JSON); err != nil {
return nil, err
}
credentialsFile = f.Name()
} else {
credentialsFile = config.CredentialsFile
}
if err != nil {
return nil, err
}
cmd, err := config.toArguments()
if err != nil {
return nil, err
}
cmd = append(cmd, "-x")
image := dockerImage
if config.ConnectToEmulator {
image = dockerImageWithEmulator
}
if config.Version != "" {
image += ":" + config.Version
}
req := testcontainers.ContainerRequest{
AlwaysPullImage: config.ExecutionEnvironment.(*Docker).AlwaysPullImage,
Image: image,
ExposedPorts: []string{"5432/tcp"},
WaitingFor: wait.ForListeningPort("5432/tcp"),
HostConfigModifier: func(hostConfig *container.HostConfig) {
if !config.ExecutionEnvironment.(*Docker).KeepContainer {
hostConfig.AutoRemove = true
}
},
}
if !config.ConnectToEmulator {
req.Cmd = cmd
req.Files = []testcontainers.ContainerFile{
{
HostFilePath: credentialsFile,
ContainerFilePath: "/credentials.json",
FileMode: 700,
},
}
req.Env = map[string]string{"GOOGLE_APPLICATION_CREDENTIALS": "/credentials.json"}
}
pgadapter = &PGAdapter{}
pgadapter.container, err = testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
ContainerRequest: req,
Started: true,
})
if err != nil {
return nil, err
}
mappedPort, err := pgadapter.container.MappedPort(ctx, "5432/tcp")
if err != nil {
return pgadapter, err
}
pgadapter.port = mappedPort.Int()
// Wait for PGAdapter to start.
if err := waitForPort(pgadapter.port /* initialWait = */, 0, 50*time.Millisecond, 20); err != nil {
return nil, err
}
return pgadapter, nil
}