docker chạy <IMAGE> <NHIỀU QUY TẮC>


255

Tôi đang cố gắng chạy các lệnh MULTIPLE như thế này.

docker run image cd /path/to/somewhere && python a.py

Nhưng điều này mang lại cho tôi lỗi "Không có tệp hoặc thư mục như vậy" vì nó được hiểu là ...

"docker run image cd /path/to/somewhere" && "python a.py"

Có vẻ như một số ký tự ESCAPE như "" hoặc () là cần thiết.

Vì vậy, tôi cũng đã cố gắng

docker run image "cd /path/to/somewhere && python a.py"
docker run image (cd /path/to/somewhere && python a.py)

nhưng chúng không hoạt động.

Tôi đã tìm kiếm Docker Run Reference nhưng không tìm thấy bất kỳ gợi ý nào về các ký tự ESCAPE.

Câu trả lời:


440

Để chạy nhiều lệnh trong docker, hãy sử dụng /bin/bash -cvà dấu chấm phẩy;

docker run image_name /bin/bash -c "cd /path/to/somewhere; python a.py"

Trong trường hợp chúng ta cần lệnh2 (python) sẽ được thực thi khi và chỉ khi lệnh1 (cd) trả về trạng thái thoát zero (không có lỗi), hãy sử dụng &&thay vì;

docker run image_name /bin/bash -c "cd /path/to/somewhere && python a.py"

Cảm ơn bạn đã gợi ý của bạn! Tôi chỉ đơn giản đã thử [docker run image "cd / bin; ls"] và nhận được các thông báo lỗi sau. [exec: "cd / bin; ls": stat cd / bin; ls: không có tệp hoặc thư mục như vậy] [Phản hồi lỗi từ daemon: Không thể khởi động container]
ai0307

1
Bất cứ ai cũng tìm thấy câu trả lời này có thể quan tâm đến cách sử dụng tài liệu ở đây để cung cấp các lệnh cho một container: đây là câu trả lời của tôi cho câu hỏi khác như thế này về các tài liệu ở đây, vui lòng kiểm tra nó .
Kohányi Róbert 3/03/2016

14
docker run alpine sh -c "ls | wc >> xxx"Điều này giúp tôi rất nhiều, khi bash không có sẵn.
Eddy Hernandez

1
Điều này hoạt động cdnhưng không phải cho những thứ mà mã trả về ;không quan trọng như &&xem unix.stackexchange.com/questions/37069/ mẹo
Nick Zalutskiy

1
Cảm ơn @NickZalutskiy, đã cập nhật câu trả lời với nhận xét của bạn
anhlc

31

Bạn có thể làm điều này một vài cách:

  1. Sử dụng tùy chọn -w để thay đổi thư mục làm việc:

    -w, --workdir = "" Thư mục làm việc bên trong container

    https://docs.docker.com/engine/reference/commandline/run/#set-usiness-directory--w

  2. Truyền toàn bộ đối số cho / bin / bash:

    docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"
    

Không đề cập đến --workdirtrong liên kết được cung cấp. Trang này có thể đã di chuyển / thay đổi. Có thể được cập nhật lên docs.docker.com/engine/reference/run/#workdir hoặc docs.docker.com/engine/reference/commandline/run
marcv

10

Bạn cũng có thể đặt lệnh ống trong bộ chứa Docker, bash -c "<command1> | <command2>"ví dụ:

docker run img /bin/bash -c "ls -1 | wc -l"

Nhưng, không cần gọi shell trong điều khiển từ xa, đầu ra sẽ được chuyển hướng đến thiết bị đầu cuối cục bộ.


3

Nếu bạn muốn lưu trữ kết quả trong một tệp bên ngoài vùng chứa, trong máy cục bộ của bạn, bạn có thể làm một cái gì đó như thế này.

RES_FILE=$(readlink -f /tmp/result.txt)

docker run --rm -v ${RES_FILE}:/result.txt img bash -c "cat /etc/passwd | grep root > /result.txt"

Kết quả của các lệnh của bạn sẽ có sẵn trong /tmp/result.txtmáy cục bộ của bạn.


2

Đối với bất kỳ ai khác đến đây muốn làm điều tương tự với docker-composebạn chỉ cần trả trước bash -cvà kèm theo nhiều lệnh trong dấu ngoặc kép, được nối với nhau &&.

Vì vậy, trong ví dụ về OP docker-compose run image bash -c "cd /path/to/somewhere && python a.py"


cái này hoạt động với tôi nhưng quá trình
docker

và làm thế nào để tôi thoát khỏi một quá trình docker như vậy? nhấn ctrl C hoặc ctrl Z hoặc gõ thoát không hoạt động hoặc tôi có phải giết nó bằng lệnh dừng docker không?
node_man

không docker-compose down [service-name]không hoạt động hoặc? (và không phải lo lắng, bạn hoan nghênh, vui lòng giúp đỡ :))
S ..

2

Chỉ cần đưa ra một câu trả lời thích đáng từ nhận xét của @Eddy Hernandez và điều này rất đúng vì Alpine đi kèm với tro không bash.

Câu hỏi đặt ra hiện nay referes để Bắt đầu một vỏ trong container Docker Alpine mà ngụ ý sử dụng shhay ashhay /bin/shhay /bin/ash/.

Dựa trên câu hỏi của OP:

docker run image sh -c "cd /path/to/somewhere && python a.py"


1

bash -choạt động tốt nếu các lệnh bạn đang chạy tương đối đơn giản. Tuy nhiên, nếu bạn đang cố chạy một chuỗi lệnh dài chứa đầy các ký tự điều khiển, nó có thể trở nên phức tạp.

Tôi đã thành công khắc phục điều này bằng cách đưa các lệnh của tôi vào quá trình từ bên ngoài, tức là

cat script.sh | docker run -i <image> /bin/bash

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.