2015-07-30 29 views
14

Tôi nghĩ rằng tôi đã hiểu các tài liệu, nhưng có lẽ tôi đã không. Tôi đã có ấn tượng rằng cờ -v /HOST/PATH:/CONTAINER/PATH là hai chiều. Nếu chúng ta có tệp hoặc thư mục trong vùng chứa, chúng sẽ được nhân đôi trên máy chủ cho chúng ta một cách để giữ lại các thư mục và tệp ngay cả sau khi loại bỏ một vùng chứa docker.Docker - Mount Directory Từ Container đến Host

Trong hình ảnh Docker chính thức của MySQL, công trình này hoạt động. Các /var/lib/mysql có thể được ràng buộc với máy chủ và tồn tại khởi động lại và thay thế container trong khi duy trì dữ liệu trên máy chủ.

Tôi đã viết một tập tin Docker cho sphinxsearch-2.2.9 cũng giống như một thực tế và vì lợi ích của việc học và sự hiểu biết, ở đây nó là:

FROM debian 

ENV SPHINX_VERSION=2.2.9-release 

RUN apt-get update -qq && DEBIAN_FRONTEND=noninteractive apt-get install -yqq\ 
    build-essential\ 
    wget\ 
    curl\ 
    mysql-client\ 
    libmysql++-dev\ 
    libmysqlclient15-dev\ 
    checkinstall 

RUN wget http://sphinxsearch.com/files/sphinx-${SPHINX_VERSION}.tar.gz && tar xzvf sphinx-${SPHINX_VERSION}.tar.gz && rm sphinx-${SPHINX_VERSION}.tar.gz 

RUN cd sphinx-${SPHINX_VERSION} && ./configure --prefix=/usr/local/sphinx 

EXPOSE 9306 9312 

RUN cd sphinx-${SPHINX_VERSION} && make 

RUN cd sphinx-${SPHINX_VERSION} && make install 

RUN rm -rf sphinx-${SPHINX_VERSION} 

VOLUME /usr/local/sphinx/etc 
VOLUME /usr/local/sphinx/var 

Rất đơn giản và dễ dàng để có được đầu của bạn được bao bọc xung quanh trong khi học tập. Tôi chỉ định/etc &/var thư mục từ việc xây dựng nhân sư để lệnh VOLUME nghĩ rằng nó sẽ cho phép tôi làm một cái gì đó như -v ~/dev/sphinx/etc:/usr/local/sphinx/etc -v ~/dev/sphinx/var:/usr/local/sphinx/var, nhưng nó không phải, thay vào đó nó ghi đè lên các thư mục bên trong container và để trống. Khi tôi xóa cờ -v và tạo vùng chứa, các thư mục có các tệp dự kiến ​​và chúng không bị ghi đè.

Đây là những gì tôi chạy để tạo ra các tập tin Docker sau khi điều hướng đến thư mục mà nó ở: docker build -t sphinxsearch .

Và một khi tôi có đã tạo ra, tôi làm như sau để tạo ra một container dựa trên hình ảnh đó: docker run -it --hostname some-sphinx --name some-sphinx --volume ~/dev/docker/some-sphinx/etc:/usr/local/sphinx/etc -d sphinxsearch

Tôi thực sự đánh giá cao sự giúp đỡ và thông tin chi tiết về cách làm việc này. Tôi nhìn vào hình ảnh MySQL và không thấy bất cứ điều gì huyền diệu mà họ đã làm để làm cho các thư mục bindable, họ sử dụng VOLUME.

Cảm ơn bạn trước.

+0

Bạn nhận ra rằng trong Dockerfile, "VOLUME/usr/local/sphinx/etc" không giống với docker run -v/usr/local/sphinx/etc:/usr/local/sphinx/etc "don Các bạn trước đây bỏ qua hệ thống tập tin phân lớp, sau đó ánh xạ nó vào một con đường mà bạn chọn trên máy chủ, thường là cả hai được sử dụng cùng nhau – Matt

+0

Vâng, tôi đã nhận thức được điều đó.Tôi muốn truy cập các thư mục từ thùng chứa đó là cách duy nhất tôi có thể nghĩ về cách làm điều đó Tôi đăng trên diễn đàn docker và không nhận được sự giúp đỡ hay lời khuyên nào, đây là kết quả của việc chơi đùa với nó và –

Trả lời

10

Sau vô số giờ nghiên cứu, tôi quyết định mở rộng hình ảnh của tôi với Dockerfile sau:

FROM sphinxsearch 

VOLUME /usr/local/sphinx/etc 
VOLUME /usr/local/sphinx/var 

RUN mkdir -p /sphinx && cd /sphinx && cp -avr /usr/local/sphinx/etc . && cp -avr /usr/local/sphinx/var . 

ADD docker-entrypoint.sh/
RUN chmod +x /docker-entrypoint.sh 

ENTRYPOINT ["/docker-entrypoint.sh"] 

Mở rộng nó được hưởng lợi đó tôi ở chỗ tôi không có để xây dựng toàn bộ hình ảnh từ đầu như tôi đã thử nghiệm và chỉ xây dựng các phần có liên quan.

Tôi tạo ra một EntryPoint để thực hiện một kịch bản bash đó sẽ sao chép các tập tin trở lại đến đích cần thiết cho nhân sư để chạy đúng, đây là mã:

#!/bin/sh 
set -e 

target=/usr/local/sphinx/etc 

# check if directory exists 
if [ -d "$target" ]; then 
    # check if we have files 
    if find "$target" -mindepth 1 -print -quit | grep -q .; then 
     # no files don't do anything 
     # we may use this if condition for something else later 
     echo not empty, don\'t do anything... 
    else 
     # we don't have any files, let's copy the 
     # files from etc and var to the right locations 
     cp -avr /sphinx/etc/* /usr/local/sphinx/etc && cp -avr /sphinx/var/* /usr/local/sphinx/var 
    fi 
else 
    # directory doesn't exist, we will have to do something here 
    echo need to creates the directory... 
fi 

exec "[email protected]" 

Có quyền truy cập vào/etc &/var các thư mục trên máy chủ lưu trữ cho phép tôi điều chỉnh các tệp trong khi vẫn giữ chúng được lưu trữ trên máy chủ giữa các lần khởi động lại và vv .. Tôi cũng có dữ liệu được lưu trên máy chủ lưu trữ sẽ tồn tại khi khởi động lại.

Tôi biết đó là một chủ đề tranh luận về vùng chứa dữ liệu so với lưu trữ trên máy chủ, tại thời điểm này tôi đang hướng tới lưu trữ trên máy chủ, nhưng sẽ thử phương pháp khác sau. Nếu bất cứ ai có bất kỳ lời khuyên, lời khuyên, vv ... để cải thiện những gì tôi có hoặc một cách tốt hơn, xin vui lòng chia sẻ.

Cảm ơn bạn @ h3nrik đã đề xuất và cung cấp trợ giúp!

1

Gắn các thư mục vùng chứa vào máy chủ là chống lại các khái niệm docker. Điều đó sẽ phá vỡ nguyên tắc đóng gói quy trình/tài nguyên.

Cách khác - gắn một thư mục lưu trữ vào một vùng chứa - là có thể. Nhưng thay vào đó tôi muốn đề xuất sử dụng volume containers.

+0

Làm thế nào để nó hoạt động với MySQL và gắn thư mục/var/lib/mysql để duy trì dữ liệu trên máy chủ? Tôi muốn làm điều tương tự. –

+0

Có thể gắn là từ sai, cách chia sẻ một thư mục từ t ông container cho máy chủ, ví dụ như một thư mục cấu hình? –

+1

Đơn giản chỉ cần tạo một thùng chứa khối lượng cho '/ var/lib/mysql' với:' docker run -it --name mysqldata -v/var/lib/mysql mysql/bin/true'. Sau đó liên kết đến nó từ thùng chứa dịch vụ mysql của bạn thông qua: 'docker run -d --name mysqlserver --volumes-from mysqldata mysql'. – h3nrik

Các vấn đề liên quan