Docker中的Dropbox

我想在Docker容器中运行Dropbox。 这样我可以通过将数据上传到Dropbox来同步数据。 并且还要维护数据备份,这在运行Docker镜像的新版本时非常有用。

创build了这个简单的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 

在构build并运行Docker镜像后,Dropbox说: 这台计算机没有链接到任何Dropbox帐户…

并提供将Dropbox帐户与当前计算机关联的链接。 链接后,我看到一个欢迎消息,并在/ root / Dropbox文件夹内合成数据。

我提交docker更改

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

但是,当杀死docker集装箱,再次运行它Dropbox坚持: 这台电脑没有链接到任何Dropbox帐户…

我确认内部容器中存在文件夹/ root / Dropbox,数据在那里,在以前的容器执行期间同步。 但是我的容器丢失了与Dropbox的链接,需要重新链接。

我错过了什么? 如何保持容器执行之间的Dropbox-Docker_container链接?

在构build并运行Dockerfile之后,遇到的第一个问题是runit抱怨缺less权限。 您需要在复制服务脚本后添加RUN chmod +x /etc/service/dropbox/run

研究重新启动之间的变化,我发现/root/.dropbox/instance1/hostkeys/root/.dropbox/instance_db/hostkeys更改。 这可能与您使用的Phusion映像有关,但我不知道为什么。 我的猜测是,这是因为你通过exec运行dropboxd (因此不使用Bash),每次运行它(=启动容器)时,从哪里获得以前的configuration,都没有用户主文件夹可见。 可能的是,将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帐户的安全设置中find它。

提交: docker commit dropbox-auth dropbox

之后运行它: docker run -d --name my-dropbox-container dropbox

由于Dropbox在Dropbox主文件夹中存储有关自己的信息,因此无法更改。 但是,您可以在上面的所有步骤中使用-v标志( 请参见此处 )链接到本地​​文件夹(在容器外部)。 这将在Linux上100%工作,在Mac OS X上,这有点“有时有用,有时不起作用”。

根据你想要在容器中运行Dropbox的原因, -v标志(通过链接一个主文件夹和一个容器文件夹)可能正是你正在寻找的,可能不需要渲染Dropbox的设置。

奖励提示:如果你想访问正在运行的容器中的一个shell,从Docker 1.3开始,你不需要SSH了。 您可以使用docker exec -it <CONTAINER> /bin/bash归档相同的目标。

我设法通过在glusterfs挂载点上存储/root/.dropbox目录,在fleetctl下的CoreOS集群中pipe理的Docker容器中运行dropbox。 通过这种方式,我可以将容器中的整个Dropbox文件夹同步,然后使用rsync复制我想要的容器外的.png和.txt文件,重置进程中的所有权和权限。

正如@herrbischoff所指出的那样,关键在于使用-v选项向docker显示:

 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将自动启动同步。

 root@hs_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和每10秒调用rsync的简单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