Cách chạy 2 lệnh với trình điều khiển docker


84

Tôi cần chạy 2 lệnh với trình điều khiển docker. Tôi đang sao chép một tệp ra khỏi vùng chứa docker và không muốn phải xử lý thông tin đăng nhập để sử dụng thứ gì đó như ssh. Lệnh này sao chép một tệp:

sudo docker exec boring_hawking tar -cv /var/log/file.log | tar -x

Nhưng nó tạo ra một thư mục con var / log, tôi muốn tránh điều đó, vì vậy nếu tôi có thể thực hiện những điều này trong vùng chứa docker, tôi nên:

cd /var/log ; tar -cv ./file.log

Làm cách nào để tôi có thể thực thi docker chạy 2 lệnh?

Câu trả lời:


136

Điều này dẫn đến câu trả lời: Ký tự thoát trong dòng lệnh Docker, tôi đã kết thúc việc này:

sudo docker exec boring_hawking bash -c 'cd /var/log ; tar -cv ./file.log' | tar -x

Vì vậy, nó hoạt động bằng cách chạy một lệnh bash với một tham số là 2 lệnh tôi muốn chạy.


Cảm ơn bạn rất nhiều, điều này giúp tôi rất nhiều
nói ra

Nếu bạn đã có trích dẫn đôi bên trong lệnh, sau đó bạn có thể làm như vậy -c "cd /var/log; tar -cv \"$1\""nếu file là tham số 1.
zed

27

Thông thường, nhu cầu của một số lệnh là thay đổi thư mục làm việc - như trong câu hỏi của OP.

Do đó, docker hiện có một -wtùy chọn để chỉ định thư mục làm việc. Ví dụ trong trường hợp hiện tại

docker exec -w /var/log boring_hawking tar -cv ./file.log

Thực sự hữu ích, đây là cách để đi.
TortelliEngineer

điều này thật đúng với gì mà tôi đã tìm kiếm!
Clay Mitchell

11

Đối với bất kỳ ai khác tình cờ gặp phải điều này và muốn có một cách khác để chỉ định nhiều lệnh để thực thi một tập lệnh phức tạp hơn:

cat <<EOF | docker exec --interactive boring_hawking sh
cd /var/log
tar -cv ./file.log
EOF

Đây là một giải pháp rất dễ đọc khi bạn muốn thực thi một tập lệnh phức tạp hơn. Nó xứng đáng được nhiều phiếu bầu hơn;)
Slava Fomin II

tôi gặp the input device is not a TTYlỗi với phương pháp này
Roy Shilkrot

Tôi --interactivephải quan tâm đến điều đó, nếu không phải vậy thì tôi không chắc điều gì đang xảy ra nếu không có ngữ cảnh rộng hơn về cách bạn đang sử dụng điều này.
zbrunson

6

Nếu có ai khác đã đến đây để tìm câu trả lời tuyệt vời, nhưng cũng muốn có một cách tốt hơn để giải quyết vấn đề ban đầu của OP (OP của OP ..?) Để sao chép tệp ra khỏi bộ chứa docker, thì hiện tại có một docker cplệnh sẽ thực hiện việc này: https: //docs.docker.com/engine/reference/commandline/cp/


tốt, thực sự tốt đẹp
Solx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.