[英]moving a file in a container to a folder that has a mounted volume docker
我正在尝试在 docker 上运行 golang 应用程序。但是当我尝试将容器中创建的文件移动到创建的卷所在的文件夹时,我收到错误消息:重命名/mygo/newt /mygo/store/newt:无效交叉-设备链接
我的高朗代码
package main
import (
"bufio"
"fmt"
"os"
"path/filepath"
"strings"
)
func main() {
for {
fmt.Println("do you want to create a file,y for yes, n for no")
var ans string
fmt.Scanln(&ans)
if ans == "y" {
var userFile string
fmt.Println("enter name of file")
fmt.Scanln(&userFile)
myfile, err := os.Create(userFile)
if err != nil {
fmt.Printf("error creating file::%v\n", err)
return
}
fmt.Println("enter text to write in file")
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\t')
if err != nil {
fmt.Println("an error occured while reading::", err)
return
}
input = strings.TrimSuffix(input, "\t")
num, err := myfile.WriteString(input)
if err != nil {
fmt.Println("error while writing to file", err)
}
fmt.Printf("%v characters entered \n", num)
defer myfile.Close()
fmt.Println("created a file", userFile)
fmt.Println("===========")
fmt.Println("moving file to default folder")
pwd, err_pwd := os.Getwd()
if err_pwd != nil {
fmt.Printf("could not get current working directory::%v\n", err_pwd)
}
userFilePath := pwd + "/" + userFile
fmt.Println(pwd)
destinationFilePath := pwd + "/store/" + userFile
//destinationFilePath := pwd + "/default/" + userFile
err_moving := os.Rename(userFilePath, destinationFilePath)
if err_moving != nil {
fmt.Printf("Error occured while moving file::%v\n", err_moving)
return
}
fmt.Println("file moved")
continue
}
pwd, err_pwd := os.Getwd()
if err_pwd != nil {
fmt.Printf("could not get current working directory::%v\n", err_pwd)
}
fmt.Println("enter full path to move to default location")
var userFilePath string
fmt.Scanln(&userFilePath)
userFileName := filepath.Base(userFilePath)
destinationFilePath := pwd + "/" + userFileName
err_move := os.Rename(userFilePath, destinationFilePath)
if err_move != nil {
fmt.Printf("error occured while moving file:::%v", err_move)
return
}
fmt.Println("file moved")
continue
}
}
dockerfile
FROM golang
WORKDIR /mygo
COPY . .
RUN go build -o app
CMD ["./app"]
错误后程序退出
在 Linux 中有两种方法可以“重命名”一个文件。
将目录条目移动到新位置,但保持文件内容不变。
这具有速度快的优点。 它的缺点是在将文件从一个文件系统移动到另一个文件系统时不起作用。
创建一个新文件,将数据复制到新文件,删除旧文件。
但是,如果源和目标位于两个不同的文件系统上,它将起作用。
方法#1 在这种情况下不起作用。 你需要方法#2。
更多资源:
renameat()
系统调用。 本手册页解释了它是如何工作的。 您遇到的具体错误是 EXDEV 错误:“oldpath 和 newpath 不在同一个挂载的文件系统上。(Linux 允许在多个点挂载文件系统,但 rename() 不能跨不同的挂载点工作,即使两者上都安装了相同的文件系统。)”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.