我知道在运行映像时装入/使用卷会覆盖容器中的目录以及主机上的目录。
我想知道这是否可以通过其他方式完成。
我在my-image
期间创建的docker build
中有数据。
docker run -dit --volume ~/data:/usr/data my-image
通过上面的命令,主机~/data
目录将在Docker容器内部映射到/usr/data
目录。我想要相反的行为,我希望容器/usr/data
目录映射到主机~/data
(实际上是覆盖主机目录~/data
中的所有内容)。
这可能吗?
答案 0 :(得分:0)
以下是一些想法:
将容器内的文件夹变成一个卷(例如,将其标记为VOLUME
内的Dockerfile
)
在主机上,将卷文件夹链接或安装到所需位置
(取决于有效的方法和您的需要)。
这是可能的,因为卷位于/var/lib/docker/volumes/
内部
-您只需要通过检查容器来找到相关的文件夹。
这样做的好处是,即使容器未运行,您也可以访问数据。
sshfs
更通用的解决方案是使用类似sshfs
的东西。
显然,这需要您的容器运行ssh
并建立
连接,然后才能访问容器中的数据。
答案 1 :(得分:0)
@Tomasz提出了一种解决方案,这也是可行的, 但是,在发布答案之前,我将分享我们的用例,为什么要这样做。
我们在创建时将主机的/data/
目录映射到容器/root/data/
的空目录,然后将远程代码从/home/tempdata/data/
复制到容器的/root/data
在启动时,它将覆盖安装目录(即主机~/data
)中的所有内容。
因此,用户将从容器中获取最新代码以托管目录,这意味着一种覆盖有点困难的方式来实现相反的情况。
docker build -t override .
docker run -it --rm --privileged -p 8081:8080 --name tt -v ~/data/:/root/data override
这是基于alpine的Dockerfile
FROM python:3.6-alpine
RUN mkdir -p /etc/supervisord.d
RUN apk add --no-cache supervisor git npm
# general config for supervisord
RUN echo $'[supervisord] \n\
[unix_http_server] \n\
file = /tmp/supervisor.sock \n\
chmod = 0777 \n\
chown= nobody:nogroup \n\
[supervisord] \n\
logfile = /tmp/supervisord.log \n\
logfile_maxbytes = 50MB \n\
logfile_backups=10 \n\
loglevel = info \n\
pidfile = /tmp/supervisord.pid \n\
nodaemon = true \n\
umask = 022 \n\
identifier = supervisor \n\
[supervisorctl] \n\
serverurl = unix:///tmp/supervisor.sock \n\
[rpcinterface:supervisor] \n\
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface \n\
[include] \n\
files = /etc/supervisord
# clone remote code so that can override local code of the user specified directory
RUN git clone https://github.com/IBM-Bluemix/bluemix-hello-node /home/tempdata/data/
# copy code from container directory to host mount directory
RUN echo $'#!/bin/ash \n\
echo "********************************8" \n\
mkdir -p /root/data/ \n\
mkdir -p /home/tempdata/ \n\
echo "*******Overiding /data/ of host machine ****" \n\
# this will override host machine files like if server.js modified on host this will overide with remote server.js
cp -r /home/tempdata/data/ /root/ \n\
cd /root/data/; npm i; npm start' >> /root/override.sh
RUN echo $'[supervisord] \n\
nodaemon=true \n\
[program:override] \n\
command=/root/override.sh \n\
stdout_logfile=/dev/fd/1 \n\
stdout_logfile_maxbytes=0MB \n\
stderr_logfile_maxbytes = 0 \n\
stderr_logfile=/dev/fd/2 \n\
redirect_stderr=true \n\
autorestart=false \n\
startretries=0 \n\
exitcodes=0 ' >> /etc/supervisord.d/override.conf
RUN chmod +x /root/override.sh
EXPOSE 8080
ENTRYPOINT ["supervisord", "--nodaemon", "--configuration", "/etc/supervisord.conf"]