2015-01-08 16 views
13

Tôi muốn chạy Dropbox bên trong vùng chứa Docker. Bằng cách này tôi có thể đồng bộ dữ liệu với docker bằng cách tải nó lên Dropbox. Và cũng duy trì sao lưu dữ liệu, điều đó sẽ hữu ích khi chạy phiên bản mới của hình ảnh docker.Dropbox trong Docker

Created Dockerfile đơn giản này

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"] 

Và tập tin dịch vụ dropbox.sh

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

Sau khi xây dựng và chạy Docker hình ảnh, Dropbox nói: Máy tính này không được liên kết với bất kỳ tài khoản Dropbox ...

và cung cấp liên kết để liên kết tài khoản Dropbox với máy tính hiện tại. Sau khi liên kết, tôi thấy một thông điệp chào mừng và dữ liệu là thư mục syncyd bên trong/root/Dropbox.

tôi cam kết Docker thay đổi

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

Nhưng khi giết chứa Docker và chạy nó một lần nữa khẳng định Dropbox: Máy tính này không được liên kết với bất kỳ tài khoản Dropbox ...

Tôi xác nhận rằng bên trong container, thư mục/root/Dropbox tồn tại, và dữ liệu là có, đồng bộ hóa trong quá trình thực hiện container trước đó. Nhưng vùng chứa của tôi bị mất liên kết tới Dropbox và cần được liên kết lại.

Tôi đang thiếu gì? Làm thế nào để tồn tại liên kết Dropbox-Docker_container giữa các thực thi container?

Trả lời

7

Đã xây dựng và chạy Dockerfile của bạn, vấn đề đầu tiên tôi gặp phải là runit phàn nàn về các quyền bị thiếu. Bạn cần thêm RUN chmod +x /etc/service/dropbox/run sau khi sao chép tập lệnh dịch vụ.

Nghiên cứu những thay đổi giữa các lần khởi động lại, tôi đã nhận thấy rằng /root/.dropbox/instance1/hostkeys/root/.dropbox/instance_db/hostkeys thay đổi. Điều này có thể liên quan đến hình ảnh Phusion bạn sử dụng, mặc dù tôi sẽ không biết tại sao chính xác. Tôi đoán là vì bạn đang chạy dropboxd qua exec (do đó không sử dụng Bash), mỗi khi bạn chạy nó (= bắt đầu vùng chứa), sẽ không có thư mục nhà người dùng nào hiển thị với quy trình từ nơi nhận cấu hình trước đó. Có thể, để lại exec trong số các tập lệnh dịch vụ sửa lỗi đó.

Tuy nhiên, bạn có thể giảm cân toàn bộ quá trình (và hình ảnh) với ví dụ này Dockerfile Tôi whipped lên:

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 

Chỉ cần chạy nó một lần như vậy: docker -t -h <HOSTNAME> --name dropbox-auth my-dropbox-image. Sao chép liên kết xác thực và Ctrl-C khi Dropbox được liên kết. <HOSTNAME> có thể là tiêu đề mô tả hơn để bạn có thể dễ dàng tìm thấy tiêu đề đó trong cài đặt bảo mật trong tài khoản Dropbox của mình.

Commit: docker commit dropbox-auth dropbox

Sau đó chỉ cần chạy nó: docker run -d --name my-dropbox-container dropbox

Như Dropbox lưu trữ thông tin về bản thân trong thư mục chính Dropbox, bạn không thể thay đổi điều đó.Tuy nhiên, bạn có thể sử dụng cờ -v (see here) trong tất cả các bước ở trên để liên kết với một thư mục cục bộ (bên ngoài vùng chứa). Điều này sẽ làm việc 100% trên Linux, trên Mac OS X nó là loại "đôi khi nó hoạt động và đôi khi nó không".

Tùy thuộc vào lý do bạn muốn chạy Dropbox bên trong vùng chứa, cờ -v (bằng cách liên kết thư mục lưu trữ với thư mục chứa) có thể chính xác là những gì bạn đang tìm kiếm, có thể hiển thị thiết lập Dropbox không cần thiết.

Gợi ý tiền thưởng: nếu bạn muốn truy cập một trình bao trong vùng chứa đang chạy, từ Docker 1.3 trở đi bạn không cần SSH nữa. Bạn chỉ có thể sử dụng docker exec -it <CONTAINER> /bin/bash để lưu trữ cùng một mục tiêu.

+0

Dropbox có lưu trữ/khôi phục quyền fs của bạn không? Làm thế nào về nếu bạn chạy nó từ nhiều máy chủ? – BigDong

+1

Làm thế nào về việc cố gắng mà ra cho chính mình? – herrbischoff

+1

Dropbox không thay đổi quyền truy cập thư mục trong dropbox của bạn và do đó không vận chuyển bất kỳ quyền truy cập nào từ máy chủ này sang máy chủ khác (https://www.dropbox.com/en/help/60). –

2

Tôi đã quản lý để dropboxd hoạt động bên trong một vùng chứa docker được quản lý trong một cụm CoreOS trong fleetctl bằng cách lưu trữ thư mục /root/.dropbox trên một điểm gắn kết glusterfs. Bằng cách này, tôi có thể đồng bộ toàn bộ thư mục Dropbox bên trong vùng chứa, sau đó sử dụng rsync để chỉ sao chép các tệp .png và .txt mà tôi muốn bên ngoài vùng chứa, đặt lại quyền sở hữu và quyền trong quy trình.

Chìa khóa để này, như ám chỉ bởi @herrbischoff, là trình bày nó bằng cách sử dụng tùy chọn -v để Docker:

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

Sau đó bắt đầu dropboxd từ bên trong container và liên kết nó với tài khoản Dropbox của bạn. Điều này chỉ cần được thực hiện một lần. Sau đó (giả sử các script bắt đầu của bạn hoạt động), bạn khởi động nó từ một dịch vụ đơn vị fleetd để bất kỳ máy nào trong cluster có thể khởi động nó trong chế độ tách rời và dropboxd sẽ bắt đầu đồng bộ tự động.

[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 

Tôi sử dụng runit để khởi động cả dropboxd và tập lệnh shell đơn giản gọi rsync cứ 10 giây một lần.

#!/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 
Các vấn đề liên quan