How to redirect stdout from docker container to ho

2019-04-10 06:20发布

I'm trying to call docker's mysqldump from host system for save mysql dump from golang. It works correctly with host mysqldump, but don't work with docker's 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)
   }

}

I got only that for non-empty database empty mysql dump

标签: mysql docker go
3条回答
一夜七次
2楼-- · 2019-04-10 06:43

The solution is:

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)
}

}

Just without "> dbname.sql"

查看更多
孤傲高冷的网名
3楼-- · 2019-04-10 06:48

Instead of mysql, try a simple command like :

  • pwd
  • echo a > b, just to see if you do see a file b on your host.

You need to make that redirection inside the container in a folder which has been mounted from the host (using volume), in order for the created file to persists, once docker exec exits the container.

查看更多
Juvenile、少年°
4楼-- · 2019-04-10 06:50

EDIT:

The OP doesn't work inside go code. It gives an error: the input device is not a TTY. I will try to find out why and update the post...


OP:

What about using docker exec -it [command]

Example:

# 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

or

# mysqldump > stdout > file
$ docker exec -it test_mysql mysqldump -u root -proot sys > sys.sql
查看更多
登录 后发表回答