How to redirect stdout from docker container to host

I am trying to call mysqldump docker from the main system to save mysql dump from golang. It works correctly with the mysqldump host, but does not work with 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 only got this for a non- empty empty mysql dump database

+4
source share
3 answers

Decision:

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"

+2
source

Instead of mysql, try a simple command, for example:

  • pwd
  • echo a > bto see if you see the file bon your host.

, ( ), , docker exec .

+2

EDIT:

OP does not work inside code go. It gives an error: the input device is not a TTY. I will try to find out why and update the message ...


OP:

How 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
+1
source

Source: https://habr.com/ru/post/1686175/


All Articles