go-dockerclient`UploadToContainer` tar示例

时间:2016-03-12 19:42:25

标签: go docker client

与我一直使用的python docker客户端不同,似乎很少有关于如何使用go-dockerclient的示例。我正在尝试使用UploadToContainer来解决如何使用import ( "archive/tar" "bytes" "fmt" "log" ) func main() { // Create a buffer to write our archive to. buf := new(bytes.Buffer) // Create a new tar archive. tw := tar.NewWriter(buf) // Add some files to the archive. var files = []struct { Name, Body string }{ {"file1.txt", "This archive contains some text files."}, {"file2.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"}, {"file3.txt", "Get animal handling license."}, } for _, file := range files { hdr := &tar.Header{ Name: file.Name, Mode: 0600, Size: int64(len(file.Body)), } if err := tw.WriteHeader(hdr); err != nil { log.Fatalln(err) } if _, err := tw.Write([]byte(file.Body)); err != nil { log.Fatalln(err) } } // Make sure to check the error on Close. if err := tw.Close(); err != nil { log.Fatalln(err) } fmt.Print(buf) 将tar存档上传到docker容器的问题:https://godoc.org/github.com/fsouza/go-dockerclient#Client.UploadToContainer

我在内存中构建了一个.tar存档,如下所示:

import (
    "fmt"

    "github.com/fsouza/go-dockerclient"
        "os"
)

func main() {
    endpoint := "https://localhost:52376"
    path := os.Getenv("DOCKER_CERT_PATH")
    ca := fmt.Sprintf("%s/ca.pem", path)
    cert := fmt.Sprintf("%s/cert.pem", path)
    key := fmt.Sprintf("%s/key.pem", path)
    client, _ := docker.NewTLSClient(endpoint, cert, key, ca)

我也成功创建了这样的docker-client:

nginx-ssl

我有一个名为data的正在运行的容器,我需要将tar存档上传到容器中,但无法确定将tar写入容器所需的内容。

这是我使用python做的,其中cli.put_archive(container='nginx-ssl', path="/keys", data=newtar) 是预先创建的内存tar对象。

input := bytes.NewBufferString("test")
    uploadOpts := docker.UploadToContainerOptions{
        InputStream: input,
        Path:        "/test-test",
    }

    err := client.UploadToContainer("20e0c347cd41", uploadOpts)
    if err != nil {
        print(err)
    }

UPDATE ++++++

我刚试过这个:

(0xd60088,0xc820278100)

20e0c347cd41是“CONTAINER ID”

返回此错误:

//input := bytes.NewBufferString(buf)
    uploadOpts := docker.UploadToContainerOptions{
        InputStream: buf,
        Path:        "/test-test.txt",
    }

    err := client.UploadToContainer("nginx-ssl", uploadOpts)
    if err != nil {
        print(err)
    }

然后我尝试了这个:

InputStream: buf

其中panic: runtime error: invalid memory address or nil pointer dereference [signal 0xb code=0x1 addr=0x0 pc=0x2df8] goroutine 1 [running]: panic(0x3d3420, 0xc82000a0d0) 是我上面显示的tar档案的输出。这会引发以下错误:

let cell = tableView.dequeueReusableCellWithIdentifier("Identifier", forIndexPath: indexPath) as UITableViewCell

但没有上传任何内容。

1 个答案:

答案 0 :(得分:0)

如果您仍然需要它,那就是我设法使用go-dockerclient将文件(名为test.txt)上传到容器(在/ data目录中)。

content := "File content"

buf := new(bytes.Buffer)
tw := tar.NewWriter(buf)
hdr := &tar.Header{
    Name: "test.txt",
    Mode: 0644,
    Size: int64(len(content)),
}
err := tw.WriteHeader(hdr)
if err != nil {
    fmt.Println(err.Error())
}
_, err = tw.Write([]byte(content))
if err != nil {
    fmt.Println(err.Error())
}

in := sT{bytes.NewBufferString(string(buf.Bytes()))}
opts := docker.UploadToContainerOptions{Path: "data", InputStream: in}
cont, err := client.CreateContainer(options)
if err != nil {
    log.Printf(err.Error())
    return
}
err = client.UploadToContainer(container.ID, opts)

和sT定义为:

type sT struct {
   *bytes.Buffer
}

您仍然可以改进代码(比如使用更好的缓冲区),但对于我的测试,这是可以的。 结果是/data/test.txt包含文本"文件内容"

HTH