Ошибка Errno 32 на образе Alpine Linux Docker при передаче exec stdout в корзину s3 с использованием пакета разработки go cloud - PullRequest
0 голосов
/ 25 мая 2019

Я написал небольшую утилиту для передачи вывода команды mysqldump в корзину s3 в golang, которую я намерен использовать для моментального снимка и восстановления нашей базы данных в сквозной тестовой среде.Когда я запускаю это локально, все работает как положено: утилита правильно передает вывод mysqldump в корзину s3.Однако при запуске в образе Alpine Linux Docker я получаю ошибку сломанной трубы.Затем утилита отправляет пустой файл в корзину s3.

Чтобы выполнить mysqldump, я просто использую пакет exec.Код для mysqldump:

func (conf *MySQLConfig) DumpDatabases(stdout io.Writer) error {
    args := []string{"-u", conf.User, fmt.Sprintf("--password=%s", conf.Password), "-h", conf.Host, "--databases"}
    args = append(args, conf.Databases...)
    cmd := exec.Command("mysqldump", args...)

    cmd.Stdout = stdout
    cmd.Stderr = os.Stderr

    err := cmd.Start()
    if err != nil {
        return err
    }
    cmd.Wait()

    return nil
}

При загрузке в корзину S3 используется go-cdk.Он ожидает функцию, которая ожидает io.Writer в качестве ввода и возвращает error.В этом случае следующий фрагмент выполняется для передачи вывода mysqldump на s3:

bucket.Upload(func(w io.Writer) error { return mysqlConf.DumpDatabases(w) })

Код для загрузки:

func (b *Bucket) Upload(writeFunc func(io.Writer) error) error {
    // Open a connection to the bucket.
    ctx := context.Background()

    bucket, err := blob.OpenBucket(ctx, b.Url)

    if err != nil {
        return err
    }
    defer bucket.Close()

    // Add encryption header
    beforeWrite := func(asFunc func(interface{}) bool) error {
        var input *s3manager.UploadInput
        if asFunc(&input) {
            input.ServerSideEncryption = aws.String("AES256")
        }
        return nil
    }

    opts := &blob.WriterOptions{}
    opts.BeforeWrite = beforeWrite

    w, err := bucket.NewWriter(ctx, generateKey(), opts)
    if err != nil {
        return err
    }

    err = writeFunc(w)
    if err != nil {
        return err
    }

    if err := w.Close(); err != nil {
        return err
    }

    return nil
}

Любая подсказка, почему я получаю сломанную трубуошибка при запуске этого кода в Alpine Linux, пока он работает как положено локально?Любые предложения о том, как отладить эту проблему, чтобы выяснить, что именно происходит?Должен ли я использовать буферизованный ввод-вывод?

...