Docker映射文件而不是文件夹时候的坑

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/,挺坑的。