2015-01-08 29 views
13

我想在Docker容器中運行Dropbox。這樣我可以通過將數據上傳到Dropbox來同步數據。並且還要維護數據備份,這在運行Docker鏡像的新版本時非常有用。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'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 

但殺死碼頭工人容器和運行時,它再次Dropbox的堅持: 此計算機沒有連接到任何的Dropbox帳戶...

我確認在容器內部,folder/root/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映像有關,但我不知道爲什麼。我的猜測是,這是因爲您通過exec(因此不使用Bash)運行dropboxd,每次運行它時(=啓動容器),都沒有用戶主文件夾可以從過程中看到以前的配置。可能的是,將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。當Dropbox鏈接時,複製auth鏈接和Ctrl-C<HOSTNAME>可以是一個更具描述性的標題,因此您可以更輕鬆地在Dropbox帳戶的安全設置中找到它。

提交:docker commit dropbox-auth dropbox

後來才運行:docker run -d --name my-dropbox-container dropbox

如Dropbox的主文件夾中有關自身的Dropbox的存儲信息,你不能改變的。但是,您可以在上述所有步驟中使用-v標誌(see here)鏈接到本地​​文件夾(容器外部)。這將在Linux上100%工作,在Mac OS X上它有點「有時有用,有時不起作用」。

根據您希望在容器中運行Dropbox的原因,-v標誌(通過將主機文件夾鏈接到容器文件夾)可能正是您正在尋找的內容,可能會使Dropbox安裝不必要。

獎勵提示:如果你想訪問正在運行的容器中的shell,從Docker 1.3開始,你不再需要SSH了。您可以使用docker exec -it <CONTAINER> /bin/bash歸檔相同的目標。

+0

Dropbox存儲/恢復您的FS權限?如果你從多個主機運行它呢? – BigDong

+1

如何爲自己嘗試一下? – herrbischoff

+1

Dropbox不會更改Dropbox內的文件夾權限,因此不會將任何操作系統權限從一臺服務器傳輸到另一臺服務器(https://www.dropbox.com/en/help/60)。 –

2

我設法通過將/root/.dropbox目錄存儲在glusterfs掛載點下,使dropboxd在fleetctl下的CoreOS集羣中管理的Docker容器內工作。通過這種方式,我可以將容器中的整個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秒一個簡單的shell腳本。

#!/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