docker映射文件而不是文件夹的语法跟映射文件夹的时候是一样的。
比如在docker-compose.yml里面这样写
volumes:
- "./logs:/opt/my_business/logs"
- "config.ini:/opt/my_business/config.ini
坑1
如果这样写的话,映射的时候,镜像里面的config.ini
必须已经存在,不能运行时再创建。否则docker会认为镜像里不存在,docker会在容器启动的时候帮助镜像内创建文件夹名字为config.ini
, 然后程序运行的时候在创建的时候就会报config.ini is directory not file
了。
坑2
还有一个问题,docker映射的时候,如果映射的是文件而不是文件夹,是拿文件的inode
去映射的,而不是文件。而一旦宿主机使用vim修改过文件,文件的inode就变了,导致容器内的文件内容没有变,这个是巨坑。
解决办法是把文件从默认的644权限改成666权限,再用vim修改inode就不变了。证据如下:
坑3
映射的路径,宿主机要么写相对路径,要么写绝对路径,比如logs
不行,必须是./logs
,也不支持~
符号,必须用/root/
,挺坑的。