从主机访问Docker映像中的数据文件

时间:2019-06-14 13:15:07

标签: docker

我知道在运行映像时装入/使用卷会覆盖容器中的目录以及主机上的目录。

我想知道这是否可以通过其他方式完成。

我在my-image期间创建的docker build中有数据。

docker run -dit --volume ~/data:/usr/data my-image

通过上面的命令,主机~/data目录将在Docker容器内部映射到/usr/data目录。我想要相反的行为,我希望容器/usr/data目录映射到主机~/data(实际上是覆盖主机目录~/data中的所有内容)。

这可能吗?

2 个答案:

答案 0 :(得分:0)

以下是一些想法:

链接/挂接卷文件夹

  1. 将容器内的文件夹变成一个卷(例如,将其标记为VOLUME内的Dockerfile

  2. 在主机上,将卷文件夹链接或安装到所需位置 (取决于有效的方法和您的需要)。 这是可能的,因为卷位于/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 

response from docker container after boot

这是基于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"]