目录
前言
我们知道Docker通常使用数据卷挂载来持久化一些配置或者数据。
但是数据卷的挂载都是整个目录。宿主机目录映射容器内目录。
但是有些情况下,我只想将宿主机的某个配置文件映射到容器内的某个配置文件。也就是挂载单个文件,这种情况该如何实现呢?
接下来以nginx为例
应用场景
sh
# 启动容器
docker run -d --name nginx -p 80:80 nginx:1.25.4
# 进入容器
docker exec -it nginx bash
# 查看目录
root@df73a15d4099:/# ls -l /etc/nginx/
total 28
drwxr-xr-x 2 root root 4096 Feb 22 01:52 conf.d
-rw-r--r-- 1 root root 1007 Feb 14 16:03 fastcgi_params
-rw-r--r-- 1 root root 5349 Feb 14 16:03 mime.types
lrwxrwxrwx 1 root root 22 Feb 14 16:13 modules -> /usr/lib/nginx/modules
-rw-r--r-- 0 root root 676 Feb 22 02:49 nginx.conf
-rw-r--r-- 1 root root 636 Feb 14 16:03 scgi_params
-rw-r--r-- 1 root root 664 Feb 14 16:03 uwsgi_params
一般的nginx部署都使用数据卷映射 /etc/nginx/conf.d
这个目录,默认的nginx.conf
会导入所有conf.d
目录下的.conf
结尾的配置。但是有的使用对于服务器的基限要求,默认的nginx.conf
配置并不符合要求,也需要进行修改。既然要修改那么肯定是需要映射出来进行持久化存储的。按照数据卷的方式就需要将整个/etc/nginx
目录映射出来。但我现在只想映射nginx.conf
因为其他的配置并不做修改。
实现方式
使用--mount type=bind
来实现单个文件绑定也就是符号链接。
source
是宿主机的文件,target
是容器内文件
sh
docker run \
--name nginx \
--restart=always \
-p 80:80 \
-v /opt/docker_nginx/conf.d/:/etc/nginx/conf.d \
--mount type=bind,source=/opt/docker_nginx/nginx.conf,target=/etc/nginx/nginx.conf
nginx:1.25.4
缺点
经过测试发现 这种方式链接的单文件 宿主机更新无法实时同步到容器内部,需要docker restart nginx
重启容器。