Docker挂载本地卷后容器内/etc/lsyncd目录为空问题求助
解决Docker挂载目录后容器内原内容消失的问题
这个问题我之前也碰到过,核心原因是Docker挂载本地目录到容器路径时,会直接用本地目录的内容覆盖容器内原路径的内容,而不是把容器里的内容同步到本地目录。你的本地目录/docker/dcm/tst原本是空的,所以挂载后容器内的/etc/lsyncd自然就变成空的了。
下面给你两种可行的解决办法:
方法一:先手动复制容器内的默认内容到本地目录
先启动一个不挂载卷的临时容器,把容器里/etc/lsyncd的内容复制到你的本地目录,之后再挂载运行:
- 启动临时容器(让它后台运行一会儿,方便复制):
docker run --rm -d <NAME_OF_THE_IMAGE> sleep 30 - 查看这个临时容器的ID:
docker ps - 把容器内的
/etc/lsyncd内容复制到本地目录:docker cp <CONTAINER_ID>:/etc/lsyncd /docker/dcm/tst - 现在本地目录已经有内容了,再挂载运行容器:
docker run -i -t -P -v /docker/dcm/tst:/etc/lsyncd <NAME_OF_THE_IMAGE>
方法二:修改Dockerfile,自动同步默认内容
如果不想每次都手动复制,可以修改Dockerfile,让容器启动时自动检查挂载目录是否为空,为空就把默认内容复制过去:
FROM alpine RUN apk add --no-cache lsyncd # 将默认的lsyncd配置备份到临时目录 RUN cp -r /etc/lsyncd /etc/lsyncd-default # 启动时检查挂载目录,为空则复制默认内容,再执行ls命令 CMD ["/bin/sh", "-c", "if [ -z \"$(ls -A /etc/lsyncd)\" ]; then cp -r /etc/lsyncd-default/* /etc/lsyncd; fi && ls -al /etc/lsyncd"]
重新构建镜像后,不管本地目录是否为空,启动容器时都会自动确保/etc/lsyncd有内容——如果本地目录是空的,就复制默认配置;如果本地已经有自定义内容,就保留原有内容。
内容的提问来源于stack exchange,提问作者snagy
相关产品推荐
相关产品推荐

