如何将Docker容器内预构建的/root/source目录共享到本地?
问题原因
Docker的绑定挂载(-v参数)会直接覆盖容器内目标目录的原有内容。你本地的$PWD/Shared目录是空的,挂载后容器里的/root/source就被这个空目录替换了,所以看不到镜像里预先克隆的OpenWrt源码。
解决方法
方法一:先把镜像内的源码复制到本地,再挂载
- 启动一个临时容器(不挂载目录),让它保持运行:
docker run -d --name temp_openwrt my_openwrt.docker sleep 3600
- 将容器内的
/root/source目录内容复制到本地Shared目录:
docker cp temp_openwrt:/root/source $PWD/Shared
- 停止并删除临时容器:
docker stop temp_openwrt && docker rm temp_openwrt
- 现在再执行挂载命令,容器内的
/root/source就会和本地Shared目录同步,且包含原有源码:
docker run -it -v "$PWD/Shared":/root/source my_openwrt.docker
方法二:修改Dockerfile,预留源码备份目录
修改你的Dockerfile,把源码克隆到一个非挂载目录(比如/root/openwrt_source),启动容器时再把内容同步到挂载目录:
FROM ubuntu:latest # Install required packages RUN apt-get update && \ apt-get install -y git build-essential libncurses5-dev zlib1g-dev gawk flex gettext wget unzip python3 python3-distutils python3-setuptools python3-dev libssl-dev && \ apt-get install -y clang bison g++ gcc-multilib g++-multilib rsync file && \ apt-get install -y ccache ecj fastjar java-propose-classpath libelf-dev libncursesw5-dev python2.7-dev subversion swig time xsltproc # Clone OpenWrt repository到备份目录 RUN git clone https://git.openwrt.org/openwrt/openwrt.git /root/openwrt_source RUN cd /root/openwrt_source && \ ./scripts/feeds update -a && \ ./scripts/feeds install -a # Change working directory WORKDIR /root
然后用以下命令启动容器(仅当挂载目录为空时才复制源码,避免覆盖本地修改):
docker run -it -v "$PWD/Shared":/root/source my_openwrt.docker bash -c "if [ -z \"$(ls -A /root/source)\" ]; then cp -a /root/openwrt_source/. /root/source; fi && bash"
内容的提问来源于stack exchange,提问作者MOHAMED
相关产品推荐
相关产品推荐

