与我一直使用的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
但没有上传任何内容。
¶
答案 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