如何将stdout从docker容器重定向到主机

时间:2017-09-22 04:42:21

标签: mysql docker go

我试图从主机系统调用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)
   }

}

我只得到非空数据库 empty mysql dump

3 个答案:

答案 0 :(得分:2)

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

  • pwd
  • echo a > b,只是为了确定您是否在主机上看到了文件b

您需要在容器内部从主机( using volume )挂载的文件夹中进行重定向,以便在docker exec退出后,所创建的文件仍然存在容器。

答案 1 :(得分:2)

解决方案是:

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"

答案 2 :(得分:1)

修改

OP在go代码中不起作用。它给出了一个错误:the input device is not a TTY。我会试着找出原因并更新帖子......

<强> 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