2015-01-08 7 views
13

मैं डॉकर कंटेनर के अंदर ड्रॉपबॉक्स को चलाने के लिए चाहता हूं। इस तरह मैं ड्रॉपबॉक्स में अपलोड करके डॉकर के साथ डेटा सिंक कर सकता था। और डेटा बैकअप को भी बनाए रखें, जो डॉकर छवियों के नए संस्करण चलाते समय उपयोगी होगा।डॉकर में ड्रॉपबॉक्स

इस सरल 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 

बनाया गया निर्माण और डोकर छवि चलाने के बाद, ड्रॉपबॉक्स का कहना है: इस कंप्यूटर किसी भी ड्रॉपबॉक्स खाते से लिंक नहीं है ...

और मौजूदा कंप्यूटर के साथ ड्रॉपबॉक्स खाते को जोड़ने के लिए लिंक प्रदान करता है। लिंक करने के बाद, मुझे एक स्वागत संदेश दिखाई देता है और डेटा/रूट/ड्रॉपबॉक्स फ़ोल्डर के अंदर syncyd है।

मैं डोकर में परिवर्तन

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

प्रतिबद्ध लेकिन जब डोकर कंटेनर की मौत हो गई है और चल रहा इसे फिर से ड्रॉपबॉक्स का कहना है: इस कंप्यूटर किसी भी ड्रॉपबॉक्स खाते से लिंक नहीं है ...

मुझे लगता है कि इस बात की पुष्टि कंटेनर के अंदर, फ़ोल्डर/रूट/ड्रॉपबॉक्स मौजूद है, और डेटा है, पिछले कंटेनर निष्पादन के दौरान समन्वयित। लेकिन मेरे कंटेनर ड्रॉपबॉक्स से लिंक खो गया, और फिर से जुड़े होने की जरूरत है।

मुझे क्या याद आ रही है? कंटेनर निष्पादन के बीच Dropbox-Docker_container लिंक कैसे बने रहें?

उत्तर

7

अपना डॉकरफ़ाइल बनाया और चलाने के बाद, मुझे सामना करने वाला पहला अंक runit अनुपलब्ध अनुमतियों के बारे में शिकायत कर रहा था। सेवा स्क्रिप्ट की प्रतिलिपि बनाने के बाद आपको RUN chmod +x /etc/service/dropbox/run जोड़ने की आवश्यकता है।

पुनरारंभ करने के बीच क्या परिवर्तनों का शोध करना, मुझे पता चला है कि /root/.dropbox/instance1/hostkeys और /root/.dropbox/instance_db/hostkeys परिवर्तन। यह आपके द्वारा उपयोग की जाने वाली फ़्यूज़न छवि से संबंधित हो सकता है, हालांकि मुझे नहीं पता कि वास्तव में क्यों। मेरा अनुमान है कि ऐसा इसलिए है क्योंकि आप dropboxdexec (इसलिए बैश का उपयोग नहीं करते) के माध्यम से चल रहे हैं, हर बार जब आप इसे चलाते हैं (= कंटेनर शुरू करते हैं), तो पिछली कॉन्फ़िगरेशन कहां से प्राप्त करने के लिए प्रक्रिया में कोई उपयोगकर्ता होम फ़ोल्डर दिखाई नहीं देता है। संभवतः, सेवा स्क्रिप्ट से exec छोड़कर यह ठीक हो जाता है।

लेकिन, आप कर सकते हैं इस उदाहरण के साथ पूरी प्रक्रिया (और छवि) नीचे स्लिम Dockerfile मैं मार पड़ी है: docker -t -h <HOSTNAME> --name dropbox-auth my-dropbox-image:

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 

बस इसे इतना की तरह एक बार चलाते हैं। ड्रॉपबॉक्स लिंक होने पर एथ लिंक और Ctrl-C कॉपी करें। <HOSTNAME> एक और वर्णनात्मक शीर्षक हो सकता है ताकि आप इसे अपने ड्रॉपबॉक्स खाते में सुरक्षा सेटिंग्स में आसानी से खोज सकें।

प्रतिबद्ध: docker commit dropbox-auth dropbox

बाद में बस इसे चलाते हैं: docker run -d --name my-dropbox-container dropbox

ड्रॉपबॉक्स मुख्य फ़ोल्डर में खुद के बारे में ड्रॉपबॉक्स जानकारी संग्रहित के रूप में, आपको लगता है कि नहीं बदल सकते।हालांकि आप स्थानीय फ़ोल्डर (कंटेनर के बाहर) से लिंक करने के लिए उपरोक्त सभी चरणों में -v ध्वज (see here) का उपयोग कर सकते हैं। यह मैक ओएस एक्स पर लिनक्स पर 100% काम करेगा, यह कभी-कभी "कभी-कभी यह काम करता है और कभी-कभी यह नहीं करता"।

कंटेनर के अंदर ड्रॉपबॉक्स को चलाने के लिए अपने कारण के आधार पर, -v ध्वज (एक कंटेनर फ़ोल्डर के साथ होस्ट फ़ोल्डर को जोड़कर) ठीक वही हो सकता है जो आप खोज रहे हैं, संभावित रूप से ड्रॉपबॉक्स सेटअप को अनदेखा कर रहा है।

बोनस संकेत: यदि आप चलने वाले कंटेनर के भीतर एक खोल का उपयोग करना चाहते हैं, तो डॉकर 1.3 के बाद आपको अब एसएसएच की आवश्यकता नहीं है। आप एक ही लक्ष्य को संग्रहित करने के लिए बस docker exec -it <CONTAINER> /bin/bash का उपयोग कर सकते हैं।

+0

क्या ड्रॉपबॉक्स स्टोर/आपके fs अनुमतियों को पुनर्स्थापित करता है? अगर आप इसे एकाधिक होस्ट से चलाते हैं तो कैसे? – BigDong

+1

अपने लिए यह कोशिश करने के बारे में कैसे? – herrbischoff

+1

ड्रॉपबॉक्स आपके ड्रॉपबॉक्स में फ़ोल्डर अनुमतियों को नहीं बदलता है और इसलिए किसी सर्वर से किसी अन्य सर्वर पर किसी भी ओएस अनुमतियों को परिवहन नहीं करता है (https://www.dropbox.com/en/help/60)। –

2

मैं glboxfs माउंटपॉइंट पर /root/.dropbox निर्देशिका को संग्रहीत करके एक कोरोज़ क्लस्टर में प्रबंधित एक डॉकर कंटेनर के अंदर ड्रॉपबॉक्स को काम करने में कामयाब रहा। इस तरह, मैं कंटेनर के अंदर पूरे ड्रॉपबॉक्स फ़ोल्डर को सिंक कर सकता हूं, फिर केवल .png और .txt फ़ाइलों को कॉपी करने के लिए rsync का उपयोग करें जो मैं कंटेनर के बाहर चाहता हूं, प्रक्रिया में स्वामित्व और अनुमतियों को रीसेट कर रहा हूं।

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

तो कंटेनर के अंदर से dropboxd शुरू करने और अपने ड्रॉपबॉक्स खाते से लिंक:

कुंजी यह करने के लिए, के रूप में @herrbischoff द्वारा उल्लेख, -v विकल्प का उपयोग डोकर करने के लिए इसे पेश करने के लिए है। यह केवल एक बार किया जाना चाहिए। उसके बाद (आपकी प्रारंभिक स्क्रिप्ट काम करने के लिए), आप इसे एक बेड़े इकाई सेवा से शुरू करते हैं, इसलिए क्लस्टर में कोई भी मशीन इसे अलग मोड में शुरू कर सकती है और ड्रॉपबॉक्स स्वचालित रूप से सिंक प्रारंभ हो जाएगा।

[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 
संबंधित मुद्दे