5

Tôi đang cố gắng chạy ngăn xếp ELK bằng Docker. Tôi đã tìm thấy docker-elk đã thiết lập cấu hình cho tôi, sử dụng docker-compose.Làm thế nào để gắn kết thư mục lưu trữ có thể ghi container?

Tôi muốn lưu trữ dữ liệu elasticsearch trên máy chủ thay vì vùng chứa. Theo README Docker-nai sừng tấm, tôi bổ sung thêm một volumes dòng để elasticsearch 's phần của docker-compose.yml:

elasticsearch: 
    image: elasticsearch:latest 
    command: elasticsearch -Des.network.host=0.0.0.0 
    ports: 
    - "9200" 
    - "9300" 
    volumes: 
    - ../../env/elasticsearch:/usr/share/elasticsearch/data 

Tuy nhiên, khi tôi chạy docker-compose up tôi nhận được:

$ docker-compose up 
Starting dev_elasticsearch_1 
Starting dev_logstash_1 
Starting dev_kibana_1 
Attaching to dev_elasticsearch_1, dev_logstash_1, dev_kibana_1 
kibana_1  | Stalling for Elasticsearch 
elasticsearch_1 | [2016-03-09 00:23:35,193][WARN ][bootstrap    ] unable to install syscall filter: seccomp unavailable: your kernel is buggy and you should upgrade 
elasticsearch_1 | Exception in thread "main" java.lang.IllegalStateException: Unable to access 'path.data' (/usr/share/elasticsearch/data/elasticsearch) 
elasticsearch_1 | Likely root cause: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/elasticsearch 
elasticsearch_1 | at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84) 
elasticsearch_1 | at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) 
elasticsearch_1 | at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) 
... etc ... 

Nhìn trong ../../env, thư mục elasticsearch thực sự đã được tạo ra, nhưng nó trống rỗng. Nếu tôi tạo ../../env/elasticsearch/elasticsearch thì tôi gặp lỗi truy cập cho /usr/share/elasticsearch/data/elasticsearch/nodes. Nếu tôi tạo /nodes thì tôi gặp lỗi cho /nodes/0, v.v ...

Tóm lại, dường như vùng chứa không có quyền ghi vào thư mục.

Tôi làm cách nào để có quyền ghi? Tôi đã thử chmod a+wx ../../env/elasticsearch, và sau đó nó quản lý để tạo ra các thư mục tiếp theo, nhưng thư mục đó có sự cho phép drwxr-xr-x và nó bị mắc kẹt một lần nữa.

Tôi không thích ý tưởng chạy ứng dụng này dưới dạng thư mục gốc.

+0

là gì '? – kojiro

+0

@kojiro: Tôi nhận được 'UNKNOWN staff' – Claudiu

Trả lời

2

Docker không có xu hướng lo lắng về những điều này trong hình ảnh cơ sở của nó bởi vì nó hy vọng bạn sử dụng khối lượng hoặc khối lượng container. Gắn kết với máy chủ lưu trữ được hỗ trợ lớp thứ hai. Nhưng miễn là UID sở hữu thư mục không phải là số không (và có vẻ như nó không dựa trên trao đổi nhận xét của chúng tôi), bạn sẽ có thể thoát khỏi việc chạy elasticsearch với tư cách là người dùng đã sở hữu thư mục. Bạn có thể thử xóa và thêm lại người dùng elasticsearch từ vùng chứa, chỉ định UID của nó.

Bạn sẽ cần thực hiện việc này tại thời điểm điểm nhập cảnh, do đó, đặt cược tốt nhất của bạn sẽ là tạo vùng chứa tùy chỉnh. Tạo một tệp có tên là my-entrypoint với các nội dung sau:

#!/bin/bash 

# Allow running arbitrary one-off commands 
[[ $1 && $1 != elasticsearch ]] && exec "[email protected]" 
# Otherwise, fix perms and then delegate the rest to vanilla 
target_uid=$(stat -c %u /usr/share/elasticsearch/data) 
userdel elasticsearch 
useradd -u "$target_uid" elasticsearch 
. /docker-entrypoint "[email protected]" 

Đảm bảo tệp có thể thực thi được. Sau đó tạo một với Dockerfile những Nội dung:

FROM elasticsearch 
COPY my-entrypoint/
ENTRYPOINT ["/my-entrypoint"] 

Cuối cùng cập nhật tập tin Docker-compose.yml của bạn:

elasticsearch: 
    build: . 
    command: elasticsearch -Des.network.host=0.0.0.0 
    ports: 
    - "9200" 
    - "9300" 
    volumes: 
    - ../../env/elasticsearch:/usr/share/elasticsearch/data 

Bây giờ khi chạy docker-compose up cần xây dựng một container với elasticsearch biến của bạn.

(Tôi đã phải làm một cái gì đó như thế này một lần with apache for Magento.) Đầu ra của `Docker-soạn chạy --rm elasticsearch stat -c "% U% G"/ usr/share/elasticsearch/dữ liệu

+0

Ahh thú vị! Tôi đã thử những gì bạn đã viết ở đây nhưng nó đã không kết thúc làm việc ... đầu tiên tôi figured nó là '/ docker-entrypoint.sh', không phải'/docker-entrypoint', nhưng sau đó nó vẫn không hoạt động. Mặc dù vậy, tôi đã quyết định dựa trên hai câu đầu tiên của bạn, để làm cho cuộc sống của tôi dễ dàng hơn và chỉ sử dụng khối lượng được đặt tên thay thế. – Claudiu

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