2015-05-01 19 views
6

Tôi đang cố gắng để có được đầu của tôi xung quanh tùy chọn COMMAND trong docker soạn. Trong docker-compose.yml hiện tại của tôi, tôi bắt đầu hình ảnh docker ưu tiên (https://github.com/prosody/prosody-docker) và tôi muốn tạo danh sách người dùng khi vùng chứa thực sự bắt đầu.Docker Soạn và thực hiện lệnh trên vùng chứa bắt đầu

Tài liệu về thùng chứa nêu rõ rằng người dùng có thể được thực hiện bằng các tùy chọn môi trường LOCAL, DOMAIN, and PASSWORD, nhưng đây là một người dùng duy nhất. Tôi cần danh sách người dùng.

Khi đọc một số nội dung trên internet, có vẻ như sử dụng tùy chọn lệnh tôi sẽ có thể thực hiện các lệnh trong vùng chứa khởi động hoặc đang chạy.

xmpp: 
    image: prosody/prosody 
    command: prosodyctl register testuser localhost testpassword 
    ports: 
     - "5222:5222" 
     - "127.0.0.1:5347:5347" 

Nhưng điều này dường như không hoạt động, tôi đã kiểm tra để chạy vùng chứa bằng cách sử dụng docker exec -it <imageid> bash nhưng người dùng không được tạo.

Có thể thực thi lệnh trên vùng chứa đã bắt đầu bằng cách sử dụng trình tạo docker hoặc có các tùy chọn khác không?

+0

Tùy chọn lệnh ghi đè lệnh mặc định từ vùng chứa bộ đế để không thể sử dụng nó cho những gì bạn muốn. Có lẽ bạn có thể tạo một tập lệnh khởi động môi trường đầu tiên bằng cách sử dụng 'docker-compose start' và sau đó sử dụng' docker exec prosodyctl register ... 'để tạo người dùng trong vùng chứa đó? – Eelco

Trả lời

1

Các hướng dẫn COMMAND là chính xác giống như những gì được truyền vào cuối một lệnh docker run, ví dụ echo "hello world" trong:

docker run debian echo "hello world" 

Lệnh được hiểu như là đối số cho các ENTRYPOINT của hình ảnh, mà trong Trường hợp của debian là /bin/bash. Trong trường hợp hình ảnh của bạn, nó được chuyển đến this script. Nhìn vào kịch bản lệnh đó, lệnh của bạn sẽ được chuyển tới shell. Tôi đã có thể dự kiến ​​bất kỳ lệnh nào bạn vượt qua để chạy thành công, nhưng vùng chứa sẽ thoát ra khi lệnh của bạn hoàn tất. Lưu ý rằng lệnh mặc định được đặt trong Dockerfile thành CMD ["prosodyctl", "start"] có lẽ là một quy trình chạy dài khởi động máy chủ. Tôi không biết Prosody hoạt động như thế nào (hoặc thậm chí nó là gì), nhưng tôi nghĩ bạn có thể muốn bản đồ trong một tập tin cấu hình chứa người dùng của bạn, hoặc thiết lập một thùng chứa dữ liệu để duy trì cấu hình của bạn. Giải pháp đầu tiên có nghĩa là thêm một cái gì đó như:

volumes: 
    - my_prosodoy_config:/etc/prosody 

Để tệp docker-compose, trong đó my_prosody_config là thư mục chứa tệp cấu hình.

Giải pháp thứ hai có thể liên quan đến đầu tiên tạo ra một nơi chứa dữ liệu như:.

docker run -v /etc/prosody -v /var/log/prosody --name prosody-data prosody-docker echo "Prosody Data Container" 

(Echo nên hoàn thành, để lại cho bạn một container dừng lại trong đó có khối lượng thiết lập cho cấu hình và các bản ghi Chỉ cần chắc chắn bạn không docker rm chứa này một cách tình cờ)

Sau đó, trong Docker-soạn tập tin add:

volumes_from: 
    - prosody-data 

Hy vọng rằng bạn có thể thêm người dùng bằng cách chạy docker exec như bạn đã làm trước đó, sau đó chạy prosodyctl register tại dòng lệnh. Nhưng điều này phụ thuộc vào cách tính ưu việt và hình ảnh hoạt động.

1

CMD có liên quan trực tiếp đến ENTRYPOINT trong bộ đế (xem this câu hỏi để được giải thích). Vì vậy, khi thay đổi một trong số họ, bạn cũng phải kiểm tra xem điều này ảnh hưởng như thế nào đến người khác.Nếu bạn nhìn vào số Dockerfile, bạn sẽ thấy rằng lệnh mặc định là bắt đầu truy cập thông qua CMD ["prosodyctl", "start"]. entrypoint.sh chỉ cần chuyển lệnh này thông qua như Adrian đã đề cập. Tuy nhiên, lệnh của bạn sẽ ghi đè lệnh mặc định, do đó, con quỷ ưu tú của bạn sẽ không bao giờ bắt đầu. Có thể bạn muốn thử một cái gì đó như

xmpp: 
    image: prosody/prosody 
    command: sh -c prosodyctl register testuser localhost testpassword && prosodyctl start 
    ports: 
     - "5222:5222" 
     - "127.0.0.1:5347:5347" 

thay thế. thanh lịch hơn và bằng cách nào đó những gì tác giả dường như đã dự định (đánh giá từ các tập lệnh entrypoint.sh) sẽ là một cái gì đó giống như

xmpp: 
    image: prosody/prosody 
    environment: 
     - LOCAL=testuser 
     - DOMAIN=localhost 
     - PASSWORD=testpassword 
    ports: 
     - "5222:5222" 
     - "127.0.0.1:5347:5347" 

Để trả lời câu hỏi cuối cùng của bạn: không có, nó không phải là có thể (như bây giờ) để thực hiện lệnh trên một thùng chứa đang chạy thông qua docker-compose. Tuy nhiên, bạn có thể dễ dàng làm điều này với Docker:

docker exec -i prosody_container_name prosodyctl register testuser localhost testpassword 

nơi prosody_container_name là tên của container đang chạy của bạn (sử dụng docker ps vào danh sách container đang chạy).

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