Рекурсивно скопируйте каталог из контейнера на хост с помощью библиотеки docker client go

# #docker #go

#докер #Вперед

Вопрос:

Я хочу рекурсивно скопировать каталог из контейнера на хосте.

Я новичок в golang и полностью осведомлен об docker cp этом как об альтернативе, но мне нужно сделать это через клиентскую библиотеку docker

Я смог скопировать файл из контейнера на хост, но не смог сделать это для каталогов.

Вот что у меня есть до сих пор

 package main  import (  "archive/tar"  "context"  "fmt"  "io"  "os"   "github.com/docker/docker/api/types"  "github.com/docker/docker/api/types/container"  "github.com/docker/docker/client" )  func main() {  sourcePath := "/test/file.txt"  destinationPath := "/home/user/"  cli, err := client.NewClientWithOpts(client.FromEnv)   if err != nil {  panic(err)  }  myContainer, err := cli.ContainerCreate(context.Background(), amp;container.Config{  Image: "alpine:test",  }, nil, nil, nil,"")  if err != nil {  fmt.Println(err.Error(), "error occurred")  }  tarStream, _, err := cli.CopyFromContainer(context.Background(), myContainer.ID, sourcePath)  if err != nil {  fmt.Println("something went wrong", err)  }  tr := tar.NewReader(tarStream)  if _, err := tr.Next(); err != nil {  panic(err)  }   dst, err := os.Create(destinationPath   "file.txt")  if err != nil {  fmt.Println("error occurred", err)  }  defer dst.Close()   _, err = io.Copy(dst, tr)  if err != nil {  fmt.Println("error", err)  }  cli.ContainerRemove(context.Background(), myContainer.ID, types.ContainerRemoveOptions{}) }  

Но на самом деле я хочу рекурсивно скопировать весь каталог внутри контейнера /test/ на хост.

Комментарии:

1. Вместо этого вы можете запустить контейнер с подключенным к привязке томом, чтобы он записывал свои выходные данные в каталог, существующий на хосте? Или, если основной целью процесса является чтение и запись файлов хоста, возможно, изоляция файловой системы Docker не подходит для этого, и вам следует запускать приложение вне контейнера?

2. привязать монтирование громкости звучит как хороший вариант. На самом деле у меня есть куча изображений докеров, содержащих некоторые артефакты, которые мне нужно вытащить и скопировать на хост. Этот код будет выполняться внутри пользовательского контроллера kubernetes.

3. Извините, вы сказали «хост» и «Кубернетес» вместе… какой именно хост, и будет ли иметь значение, если модуль контроллера будет удален и воссоздан на другом узле? Кроме того, если это контекст Kubernetes, вы, вероятно, не сможете использовать API Docker или с пользой использовать hostPath тома, но вы можете создать PersistentVolumeClaim (возможно, с помощью набора состояний) и хранить там постоянное содержимое контейнеров.

4. извините за путаницу. Этот контроллер будет работать на хосте(узле) как служба systemd, аналогично kubelet . Таким образом, внутри контроллера я могу вызывать API docker и использовать путь к хосту, я даже могу выполнять cp docker, но я думал о способе golang сделать это с помощью клиентской библиотеки docker, я подумал, что это будет просто, но не получилось.