简体   繁体   English

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

[英]How to redirect stdout from docker container to host

I'm trying to call docker's mysqldump from host system for save mysql dump from golang. 我试图从主机系统调用docker的mysqldump来保存来自golang的mysql转储。 It works correctly with host mysqldump, but don't work with docker's mysqldump. 它与主机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)
   }

} }

I got only that for non-empty database empty mysql dump 我只得到非空数据库空mysql转储

Instead of mysql, try a simple command like : 而不是mysql,尝试一个简单的命令,如:

  • pwd
  • echo a > b , just to see if you do see a file b on your host. echo a > b ,只是为了查看您是否在主机上看到了文件b

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. 您需要在容器内部从主机( 使用卷 )挂载的文件夹中进行重定向,以便在docker exec退出容器后,所创建的文件仍然存在。

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" 只是没有“> dbname.sql”

EDIT: 编辑:

The OP doesn't work inside go code. 该OP不工作里面go的代码。 It gives an error: the input device is not a TTY . 它给出了一个错误: the input device is not a TTY I will try to find out why and update the post... 我会试着找出原因并更新帖子......


OP: OP:

What about using docker exec -it [command] 怎么样使用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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM