Làm cách nào để ghi đè CMD khi chạy hình ảnh docker?


123

Tôi muốn kiểm tra hình ảnh docker được tạo bởi người khác với cả điểm truy cập và cmd được chỉ định, ví dụ:

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

Tôi hiện đang làm:

docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login

Có cách nào để ghi đè CMD trống không (vì vậy tôi không phải sử dụng "--login")?

Câu trả lời:


126

Bạn chỉ có thể nhập qua docker run -it --entrypoint=/bin/bash $IMAGE -i(bạn sẽ khởi chạy một vùng chứa mới từ hình ảnh và nhận bash shell trong chế độ tương tác), sau đó chạy lệnh entrypoint trong vùng chứa đó.

Sau đó, bạn có thể kiểm tra container đang chạy trong trạng thái nó sẽ chạy.

EDIT: Vì Docker 1.3, bạn có thể sử dụng execđể chạy một tiến trình trong một container đang chạy. Bắt đầu container của bạn như bạn thường làm, sau đó nhập nó bằng cách phát hành:

docker exec -it $CONTAINER_ID /bin/bash

Giả sử bash được cài đặt, bạn sẽ được cấp quyền truy cập shell vào container đang chạy.


Điều đó sẽ không thực thi "/ usr / sbin / apache2ctl / bin / bash" chứ? (vì ví dụ của bạn không ghi đè điểm nhập cảnh, nó sẽ sử dụng điểm nhập được xác định trong Dockerfile - hoặc tôi có thiếu thứ gì không?)
warp

Có phải đó là một cái gì đó khác nhau cho các phiên bản docker cũ / mới hơn có lẽ? Nó chắc chắn chạy điểm vào cho tôi: gist.github.com/warpr/26a5cc471dce7fcf9021 . Đây là sử dụng docker 0.10.0 trên Ubuntu 13.10.
warp

4
Tôi biết vượt qua --entrypoint ghi đè điểm vào. Nhưng khi tôi sử dụng --entrypoint, làm cách nào để ghi đè CMD để trống? (Đối với bash, tôi có thể sử dụng một cái gì đó như -i hoặc --login, nhưng không phải tất cả các điểm nhập mà tôi có thể muốn sử dụng sẽ có một đối số "giả" tương đương).
warp

1
Ít nhất là trong Docker v1.11.1, có vẻ như việc ghi đè lên --entrypoint cũng ngăn việc nối thêm bình thường của CMD vào điểm vào. Điều đó dường như chỉ xảy ra khi điểm vào không bị ghi đè.
Jasmine Hegman

1
Tại sao có -isau $IMAGE?
Mắt Levin

27

Xem: https://docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

Phần có liên quan:

CMD (Lệnh hoặc tùy chọn mặc định) Gọi lại tùy chọn trong dòng lệnh Docker:

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

Lệnh này là tùy chọn vì người tạo IMAGE có thể đã cung cấp một LỆNH mặc định bằng cách sử dụng Dockerfile CMD. Là người vận hành (người đang chạy một container từ hình ảnh), bạn có thể ghi đè CMD đó chỉ bằng cách chỉ định một LỰA CHỌN mới.

Nếu hình ảnh cũng chỉ định ENTRYPOINT thì CMD hoặc LỆNH sẽ được thêm vào làm đối số cho ENTRYPOINT.

Vì vậy, để làm những gì bạn muốn, bạn chỉ cần xác định một cmd và ghi đè bằng cách sử dụng /bin/bash. Không hoàn toàn "trống rỗng", nhưng nó hoàn thành công việc 99%.


Rất tiếc, tôi đã bỏ qua một chi tiết. Ngoại trừ rút ngắn --loginđể -ltôi đoán giải pháp của bạn đã tốt như nó được.
Simon Thum

Đây là một điều thú vị mà tôi thấy ngày hôm nay: lệnh không bị ghi đè, nó được nối thêm. Đây là PS từ bên trong container. Lưu ý rằng lệnh tôi đã thêm là echo "thiết lập db" và lệnh tích hợp là / usr / bin / geth. Ngoài ra tôi đặt điểm vào là "". 1 ? Ssl 0:00 /usr/bin/geth echo setting up db
Paul S

Liên kết tham chiếu docker không còn hoạt động - không thể tìm thấy một sự thay thế rõ ràng cho nó.
Chris Kimpton

Tôi mới sửa nó, nhưng tôi cũng thấy khó tìm; (
Simon Thum

15

Đối với bất kỳ ai đến đây để ghi đè lệnh nhập điểm AND để truyền lệnh khác, ví dụ: chạy bash thay vì tập lệnh nhập và sau đó chạy một số lệnh khác với các tham số (không rõ ràng với tôi từ các câu trả lời khác):

 docker run [other options] --entrypoint '/bin/sh' $IMAGE -c 'npm link gulp gulp-sass gulp-sourcemaps'

-c 'npm link ...'là tham số /bin/shđể ở đây bạn có thể vượt qua bất kỳ lệnh nào bạn muốn chạy trong container. /bin/shlà cho hình ảnh núi cao, /bin/bashrất có thể cho các hình ảnh khác.


1
chỉ cần một lệnh shell add nên được viết dựa trên json, vì vậy thay vì trích dẫn bằng dấu ngoặc đơn, hãy '...'sử dụng dấu ngoặc kép"..."
Jimmy Obonyo Abor

Hoặc chỉ cần vượt qua nhiều đối số --entrypoint như bạn muốn
Nick Roz

điều này dường như không hoạt động: "exec: \" - c \ ": tập tin thực thi không được tìm thấy trong $ PATH": không xác định.
Richard

Kiểm tra đường dẫn trong container, có thể nó thực sự không tồn tại. Hầu hết các hình ảnh có /bin/shnhưng bạn có thể không phải là trường hợp đó.
infro
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.