Доступ к файлам данных в образе Docker с хоста - PullRequest
3 голосов
/ 14 июня 2019

Я знаю, что монтирование / использование тома при запуске образа перезапишет каталог в контейнере с каталогом на хосте.

Мне интересно, можно ли это сделать наоборот.

У меня есть данные в my-image, которые были созданы во время docker build.

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

Из приведенной выше команды каталог хоста ~/data будет сопоставлен внутри контейнера Docker с /usr/data справочник.Мне нужно противоположное поведение, я хочу, чтобы каталог контейнера /usr/data отображался на хост ~/data (по существу, перезаписывая что-либо внутри каталога хоста ~/data).

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

Поскольку @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

Вот 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"]
0 голосов
/ 14 июня 2019

Вот несколько идей:

Связать / смонтировать папку тома

  1. Превратить папку внутри контейнера в том (например, пометив ее как VOLUMEвнутри Dockerfile)

  2. На хосте свяжите или смонтируйте папку тома в нужное место (в зависимости от того, что работает и что вам нужно).Это возможно, потому что тома находятся внутри /var/lib/docker/volumes/ - вам просто нужно найти соответствующую папку, осмотрев контейнер.

Преимущество в том, что вы можете получить доступ к данным, даже еслиКонтейнер не запущен.

Используйте FUSE, например, sshfs

Более "универсальным" решением было бы использовать что-то вроде sshfs.

Очевидно, это требует вашегоКонтейнер для запуска ssh и для установления соединения до доступа к данным из контейнера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...