【问题标题】:How to redirect stdout from docker container to host如何将标准输出从 docker 容器重定向到主机
【发布时间】:2017-09-22 04:42:20
【问题描述】:

我正在尝试从主机系统调用 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

【问题讨论】:

  • 您正在执行 exec 并将输出重定向到文件,然后期望数据也在标准输出上,这是行不通的。您应该使用一个标准输出或重定向
  • 您的问题解决了吗?因为你确实选择了我的答案...
  • 是的,我解决了这个问题,但是用另一种方式,我会在我的答案中发布解决方案

标签: mysql docker go


【解决方案1】:

代替mysql,尝试一个简单的命令,例如:

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

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

【讨论】:

    【解决方案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"

    【讨论】:

    • 很好,但不要忘记接受你自己的答案(也不要太早接受其他答案;-))
    【解决方案3】:

    编辑:

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


    操作:

    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
    

    【讨论】:

    • 我得到了空的 mysqldump 输出。没有符号。您的命令运行良好,但在 golang 代码中不是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    相关资源
    最近更新 更多