2015-07-23 25 views
38

Tôi mới vào công nghệ Docker, tôi đang cố gắng để tạo ra một kịch bản shell cho việc thiết lập một container Docker, tập kịch bản của tôi trông giống như sauChạy một kịch bản bên trong một container Docker sử dụng shell script

#!bin/bash 

docker run -t -i -p 5902:5902 --name "mycontainer" --privileged myImage:new /bin/bash 

Chạy này tập lệnh sẽ chạy vùng chứa trong một bash mới được gọi.

Bây giờ tôi cần phải chạy một tập tin script (test.sh) mà đã được bên trong container từ shell script đưa ra ở trên. (Ví dụ: cd /path/to/test.sh & & ./test.sh) Làm thế nào để làm điều đó, xin vui lòng hỏi nếu kịch bản không rõ ràng.

+1

Tại sao không sử dụng 'WORKDIR' và 'CMD'? – Dharmit

Trả lời

45

Bạn có thể chạy một lệnh trong một container chạy bằng docker exec [OPTIONS] CONTAINER COMMAND [ARG...]:

docker exec mycontainer /path/to/test.sh 

Và để chạy từ một phiên bash:

docker exec -it mycontainer /bin/bash 

Và từ đó bạn có thể chạy script của bạn hoặc bất cứ điều gì.

+1

nếu tôi cần nhập vào/bin/bash trước và sau đó chạy lệnh bên trong bash đó? – zappy

+1

Tôi có nghĩa là tôi cần phải thực hiện 2 hoặc nhiều lệnh liên tục .... – zappy

+0

Chỉnh sửa bằng lệnh để chạy một trình tương tác –

48

Giả sử chứa Docker của bạn khởi động và chạy, bạn có thể chạy các lệnh như:

docker exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn" 
+1

Tôi thích câu trả lời này; bạn không phải đăng nhập vào vùng chứa docker để thực thi lệnh hoặc tập hợp các lệnh. Cảm ơn bạn! –

+0

Bạn có biết làm thế nào để thực hiện bước này xa hơn và vượt qua toàn bộ lệnh ('/ bin/sh -c 'cmd1; cmd2; ...; cmdn" ') làm giá trị của biến hệ vỏ? Tôi hỏi vì 'docker run' dường như mong đợi một lệnh duy nhất và các đối số không được trích dẫn riêng lẻ chứ không phải là một chuỗi được trích dẫn. – meowsqueak

+0

@meowsqueak http://stackoverflow.com/a/43019719/1663462 –

5

Tôi đã tìm kiếm câu trả lời cho cùng một câu hỏi này và tìm thấy ENTRYPOINT trong giải pháp Dockerfile cho tôi.

Dockerfile

... 
ENTRYPOINT /my-script.sh ; /my-script2.sh ; /bin/bash 

Bây giờ các kịch bản được thực hiện khi tôi bắt đầu container và tôi nhận được dấu nhắc bash sau khi kịch bản đã được thực hiện.

0

Nếu bạn muốn chạy lệnh tương tự trên nhiều trường hợp bạn có thể làm điều này:

for i in c1 dm1 dm2 ds1 ds2 gtm_m gtm_sl; do docker exec -it $i /bin/bash -c "service sshd start"; done 
Các vấn đề liên quan