2015-01-08 3 views
13

Я хотел бы запустить Dropbox внутри контейнера Docker. Таким образом, я мог синхронизировать данные с докере, загрузив их в Dropbox. А также поддерживайте резервное копирование данных, что будет полезно при запуске новых версий докеров.Dropbox in Docker

создал этот простой Dockerfile

FROM phusion/baseimage:0.9.15 

#Install wget 
RUN apt-get update && \ 
    apt-get -f install && \ 
    apt-get install -y wget 

#Install Dropbox 
RUN mkdir /usr/local/dropbox && \ 
    cd /usr/local/dropbox && \ 
    wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf - 

RUN mkdir /etc/service/dropbox 
ADD ./dropbox.sh /etc/service/dropbox/run 

# Clean up APT when done. 
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

# Use baseimage-docker's init system. 
CMD ["/sbin/my_init"] 

и служебный файл dropbox.sh

#!/bin/sh 
exec /usr/local/dropbox/.dropbox-dist/dropboxd 

После сборки и запуска Docker изображения, Dropbox говорит: Этот компьютер не связан с какой-либо учетной записи Dropbox ...

и предоставляет ссылку для связи с учетной записью Dropbox с текущим компьютером. После связывания я вижу приветственное сообщение, и данные синхронизируются внутри/root/Dropbox.

предаю докер изменения

sudo docker commit `sudo docker ps -l -q` imagename 

Но когда убивают Docker контейнер и работает он снова Dropbox настаивает: Этот компьютер не связан с какой-либо учетной записи Dropbox ...

Я подтверждаю, что внутри контейнера, папка/корень/Dropbox существует, и данные там, синхронизируются во время предыдущего выполнения контейнера. Но мой контейнер потерял связь с Dropbox, и его нужно снова связать.

Что мне не хватает? Как перенести ссылку Dropbox-Docker_container между выполнением контейнера?

ответ

7

Создав и запустив файл Dockerfile, первая проблема, с которой я столкнулся, была runit, жалуясь на отсутствие разрешений. После копирования скрипта службы вам необходимо добавить RUN chmod +x /etc/service/dropbox/run.

Исследуя какие изменения между перезагрузками, я обнаружил, что /root/.dropbox/instance1/hostkeys и /root/.dropbox/instance_db/hostkeys изменений. Это может быть связано с используемым вами изображением Phusion, хотя я точно не знаю, почему именно. Я предполагаю, что это потому, что вы используете dropboxd через exec (поэтому не используете Bash), каждый раз, когда вы его запускаете (= запуск контейнера), нет домашней папки пользователя, видимой для процесса, откуда можно получить предыдущую конфигурацию. Возможно, из-за отказа от exec исправления.

Однако, вы можете похудеть весь процесс (и изображения) с этим примером Dockerfile я взбитыми:

FROM debian:wheezy 

RUN \ 
    apt-get update && \ 
    apt-get upgrade -y 

ADD https://www.dropbox.com/download?plat=lnx.x86_64 /dropbox.tar.gz 
RUN tar xfvz /dropbox.tar.gz && rm /dropbox.tar.gz 

RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

VOLUME ["/Dropbox"] 

CMD /.dropbox-dist/dropboxd 

Просто запустите его один раз так: docker -t -h <HOSTNAME> --name dropbox-auth my-dropbox-image. Скопируйте ссылку auth и Ctrl-C, когда Dropbox связан. <HOSTNAME> может быть более описательным названием, чтобы вы могли более легко определить его в настройках безопасности в своей учетной записи Dropbox.

Commit: docker commit dropbox-auth dropbox

Затем просто запустите его: docker run -d --name my-dropbox-container dropbox

Как Dropbox хранит информацию о себе в основной папке Dropbox, вы не можете изменить.Тем не менее, вы можете использовать флаг -v (see here) на всех вышеперечисленных шагах для ссылки на локальную папку (вне контейнера). Это будет работать 100% в Linux, в Mac OS X это «иногда работает, а иногда и нет».

В зависимости от причины, по которой вы хотите запустить Dropbox внутри контейнера, флаг -v (путем связывания папки хоста с папкой с контейнером) может быть именно тем, что вы ищете, возможно, для ненужной установки Dropbox.

Бонус: если вы хотите получить доступ к оболочке в запущенном контейнере, начиная с Docker 1.3, вам больше не понадобится SSH. Вы можете просто использовать docker exec -it <CONTAINER> /bin/bash для архивирования одной и той же цели.

+0

Является ли dropbox хранить/восстанавливать разрешения fs? Как насчет того, запускаете ли вы его из нескольких хостов? – BigDong

+1

Как насчет того, чтобы попробовать это самостоятельно? – herrbischoff

+1

Dropbox не изменяет права доступа к папкам в вашем Dropbox и, следовательно, не переносит никаких разрешений os с одного сервера на другой (https://www.dropbox.com/en/help/60). –

2

Мне удалось получить dropboxd, работающий внутри контейнера докера, управляемого кластером CoreOS под fleetctl, сохраняя каталог /root/.dropbox на точке монтирования glusterfs. Таким образом, я могу синхронизировать всю папку Dropbox внутри контейнера, а затем использовать rsync для копирования только файлов .png и .txt, которые я хочу за пределами контейнера, сброса прав собственности и разрешений в процессе.

Ключ к этому, как упомянуто на @herrbischoff, чтобы представить его, используя параметр -v докер:

docker run -i -t --entrypoint=/bin/bash \ 
    -v /mnt/static/.dropbox:/root/.dropbox \ 
    -v /mnt/static/incoming:/incoming \ 
    -h static_hostname imagename 

Затем начните dropboxd внутри контейнера и связать его с вашей учетной записи Dropbox. Это нужно сделать только один раз. После этого (при условии, что ваши стартовые скрипты работают), вы запускаете его из сервисной единицы fleetd, чтобы любой компьютер в кластере мог запустить его в отдельном режиме, и dropboxd автоматически начнет синхронизацию.

[email protected]_dropbox_1001:/# ps -ef f 
UID  PID PPID C STIME TTY  STAT TIME CMD 
root   1  0 0 04:57 ?  Ss  0:00 runsvdir -P /etc/service log: .................... 
root   6  1 0 04:57 ?  Ss  0:00 runsv dropboxd 
root   8  6 4 04:57 ?  Sl  1:19 \_ /.dropbox-dist/dropbox-lnx.x86_64-3.2.4/dropbox 
root   7  1 0 04:57 ?  Ss  0:00 runsv rsync 
root   9  7 0 04:57 ?  S  0:00 \_ /bin/bash ./run 
root  664  9 0 05:24 ?  S  0:00  \_ sleep 10 

Я использую runit начать как dropboxd и простой сценарий оболочки, который вызывает Rsync каждые 10 секунд.

#!/bin/bash 

while : 
do 
    sleep 10 
    # Safety First: only copy the png and txt files (and directories) 
    # out of the container to avoid malware 
    rsync --delete-after --chmod='Dug=rwx,Do=rx,Fug=rw,Fo=r' \ 
     --numeric-ids --owner --group --chown='1000:1000' \ 
     --include='+ */' --include='+ **.png' --include='+ **.txt' --exclude='- *' \ 
     -ltsr /root/Dropbox/ /mnt/static/incoming 
done