# #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, я подумал, что это будет просто, но не получилось.