2017-09-22 139 views
4

我試圖從主機系統調用docker的mysqldump以保存從golang的mysql轉儲。它可以與主機mysqldump正常工作,但不能與docker的mysqldump一起使用。如何將stdout從Docker容器重定向到主機

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

+1

你正在做的exec和輸出重定向到一個文件,然後期待的數據是在標準輸出上也,這是行不通的。你應該使用一個標準輸出或重定向 –

+0

你解決了你的問題嗎?因爲你確實選擇了我的答案... – VonC

+0

是的,我解決了這個問題,但用另一種方式,我將解決方案發布在我的答案中 – user214603

回答

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」

+1

不錯,但不要忘記接受你自己的答案(並且不要太早接受其他答案;-)) – VonC

2

相反的MySQL,嘗試一個簡單的命令,如:

  • pwd
  • echo a > b,只是看看你是否看到你的文件b主機。

你需要使容器內是重定向已被安裝在主機(using volume)文件夾中,以便創建的文件仍然存在,一旦碼頭工人高管離開容器。

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 
+0

我得到了空的mysqldump輸出。沒有符號。你的命令效果很好,但golang代碼不是 – user214603

相關問題