如何将stdout从docker容器redirect到主机

我试图从主机系统调用docker的mysqldump保存从golang的mysql转储。 它可以与主机mysqldump正常工作,但不能与docker的mysqldump一起工作。

func writeDb(dbName string) { var mysqldumpPath string = "/usr/bin/mysqldump" //var mysqldumpPath string = "/Applications/MAMP/Library/bin/mysqldump" //cmd := exec.Command(mysqldumpPath, fmt.Sprintf("-u%s", USER), fmt.Sprintf("-p%s", PASSWORD) , dbName) cmd := exec.Command("docker", "exec", "some-mysql", mysqldumpPath, fmt.Sprintf("%s", USER), fmt.Sprintf("-p%s", PASSWORD) , dbName, ">", fmt.Sprintf("%s.sql", dbName)) stdout, err := cmd.StdoutPipe() if err != nil { log.Fatal(err) } if err := cmd.Start(); err != nil { log.Fatal(err) } bytes, err := ioutil.ReadAll(stdout) if err != nil { log.Fatal(err) } err = ioutil.WriteFile("./backup/" + dbName +".sql", bytes, 0644) if err != nil { panic(err) } 

}

我只有非空数据库空mysql转储

而不是MySQL,尝试一个简单的命令,如:

  • pwd
  • echo a > b ,只是看你是否看到主机上的文件b

您需要在已经从主机装载的文件夹中( 使用卷 )在容器内进行redirect,以便一旦docker exec退出容器时,创build的文件将保留。

解决scheme是:

 func writeDb(dbName string) { var mysqldumpPath string = "/usr/bin/mysqldump" cmd := exec.Command("docker", "exec", "some-mysql", mysqldumpPath, "-u", fmt.Sprintf("%s", USER), fmt.Sprintf("-p%s", PASSWORD) , fmt.Sprintf("%s", dbName)) stdout, err := cmd.StdoutPipe() if err != nil { log.Fatal(err) } if err := cmd.Start(); err != nil { log.Fatal(err) } bytes, err := ioutil.ReadAll(stdout) if err != nil { log.Fatal(err) } err = ioutil.WriteFile("./backup/" + dbName +".sql", bytes, 0644) if err != nil { panic(err) } 

}

只是没有“> dbname.sql”

编辑:

OP不起作用。 它给出了一个错误: the input device is not a TTY 。 我会尝试找出原因并更新post…


OP:

那么使用docker exec -it [command]

例:

 # start a new mysql container... $ docker run --rm -d --name="test_mysql" -e MYSQL_ROOT_PASSWORD=root mysql # mysqldump > stdout $ docker exec -it test_mysql mysqldump -u root -proot sys 

要么

 # mysqldump > stdout > file $ docker exec -it test_mysql mysqldump -u root -proot sys > sys.sql