func startDocker()

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
}