Подтвердить что ты не робот

Dropbox в Docker

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

Создал этот простой 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 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

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

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

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

4b9b3361

Ответ 1

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

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

Однако вы можете уменьшить весь процесс (и изображение) с помощью этого примера 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 (см. Здесь) во всех вышеперечисленных шагах для ссылки на локальную папку (вне контейнера). Это будет работать 100% на Linux, в Mac OS X это "иногда работает, а иногда и нет".

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

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

Ответ 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, так и простой оболочки script, которая вызывает 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