pool.MaxWait = 5 * time.Second if err != nil { log.Panicf("Could not connect to docker: %v", err) } err = pool.Client.Ping() if err != nil { log.Panicf("Could not connect to docker: %v", err) } runOptions := &dockertest.RunOptions{ Repository: "localstack/localstack", Tag: "latest", Name: "localstack-for-email-otp-test", Env: []string{ "SERVICES=sns,sqs,dynamodb,lambda", "DEFAULT_REGION=ap-northeast-1", "DEBUG=1", }, // ホストマシンのdocker daemonを使ってLambdaコンテナを立てるため // ホストマシンのdocker daemonとソケット通信できるようにする Mounts: []string{"/var/run/docker.sock:/var/run/docker.sock"}, } resource, err := pool.RunWithOptions(runOptions, func(config *docker.HostConfig) { config.AutoRemove = true config.RestartPolicy = docker.RestartPolicy{ Name: "no", } }, ) if err != nil { log.Panicf("Could not start resource: %v", err) } // コンテナ側の4566ポートに対応するホスト側のホストとポートを取得 // ここで取得したホストとポートを使ってLocalStackのAPIにアクセスする hostAndPort := resource.GetHostPort("4566/tcp") healthcheckFunc := func() error { resp, err := http.Get(fmt.Sprintf("http://%s/health", hostAndPort)) if err != nil { return err } if resp.StatusCode != http.StatusOK { return fmt.Errorf("status code is not 200: %d", resp.StatusCode) } return nil } if err := pool.Retry(healthcheckFunc); err != nil { pool.Purge(resource) log.Panicf("Could not success healthcheck function: %v", err) } close := func() { if err := pool.Purge(resource); err != nil { log.Panicf("Could not purge resource: %v", err) } } return close, hostAndPort }