Docker: Thêm chính sách khởi động lại vào vùng chứa đã được tạo


229

Tôi thấy rằng Docker đã thêm một cái gì đó gọi là chính sách khởi động lại để xử lý khởi động lại các container trong trường hợp, ví dụ, khởi động lại.

Mặc dù điều này rất hữu ích, tôi thấy rằng lệnh chính sách khởi động lại chỉ hoạt động docker runvà không hoạt động docker start. Vì vậy, câu hỏi của tôi là:

Có cách nào để thêm các chính sách khởi động lại vào một container đã được tạo trong quá khứ không?


Bạn nên thay đổi câu trả lời được chấp nhận thành câu trả lời của @Yale Huang. Câu trả lời được chấp nhận là không chính xác với các phiên bản hiện tại của docker. Tôi hiểu câu trả lời có thể đã giúp bạn trở lại sau đó nhưng bây giờ nó sai lệch.
Stepan Vavra

2
Làm xong. Cảm ơn bạn đã cảnh báo.
Lều Enrique Moreno

Câu trả lời:


574

Trong các phiên bản gần đây của docker (kể từ 1.11), bạn có một updatelệnh:

docker update --restart=always <container>

9
Có vẻ như điều này đã được thêm vào Docker 1.11.0.
phansen


4
Phải là câu trả lời được chấp nhận với lời cảnh báo rằng nó hoạt động như của Docker 1.11.
JohnDoe

6
với docker 17,09 Tôi đã phải chạy docker update --restart always <container> docs.docker.com/engine/admin/start-containers-automatically
HarlemSquirrel

4
docker updatechấp nhận nhiều ID container, vì vậy không cần thiết xargs, chỉ cần làm docker update --restart=always $(docker ps -q).
markusk

49

Có hai cách tiếp cận để sửa đổi RestartPolicy:

  • Tìm ra ID container, dừng toàn bộ dịch vụ docker, sửa đổi /var/lib/docker/containers/CONTAINER_ID/hostconfig.json, đặt RestartPolicy -> Name thành "always" và bắt đầu dịch vụ docker.
  • docker commit thùng chứa của bạn dưới dạng hình ảnh mới, dừng & rm vùng chứa hiện tại và bắt đầu một vùng chứa mới với hình ảnh.

2
dừng container, chỉnh sửa, bắt đầu container. hoạt động như một lá bùa. Tôi không biết tại sao chỉnh sửa bị vô hiệu hóa.
sương mù

2
Cuối cùng, một câu trả lời hợp lý :)
Navin

Làm việc cho tôi trên một máy chủ cũ với docker 1.10 (đừng hỏi). Đáng buồn thay, chỉ docker updatecho phép sửa đổi chính sách khởi động lại vào ngày 1.11+
Igor Kupczyński

1

Sử dụng --restart=alwayschính sách sẽ xử lý khởi động lại các container hiện có trong trường hợp khởi động lại.

Vấn đề là nếu có nhiều hộp với --restart=alwayskhi bạn chạy hình ảnh của một phiên bản mới hơn như đã thảo luận trong Docker - làm thế nào để bạn vô hiệu hóa tính năng tự động khởi động lại vào một container? .

Cố gắng tự động loại bỏ vùng chứa khi nó tồn tại bằng cách đặt tùy chọn docker run --rmcũng sẽ gặp vấn đề với --restart=always chính sách vì chúng xung đột lẫn nhau .

$ docker run --rm --restart always <image>
Conflicting options: --restart and --rm

Vì vậy, trong trường hợp này, tốt hơn là chọn một tùy chọn khác: - khởi động trừ khi chính sách dừng .

$ docker run --rm --restart unless-stopped <image>

Chính sách này sẽ không mâu thuẫn với docker run --rmnhưng như đã giải thích trong tài liệu hướng dẫn Docker :

Nó tương tự --restart=always, ngoại trừ khi container bị dừng (bằng tay hoặc bằng cách khác) , nó không được khởi động lại ngay cả sau khi Docker daemon khởi động lại.

Vì vậy, khi sử dụng --restart unless-stoppedchính sách này , để đảm bảo quá trình khởi động lại hoạt động trong trường hợp nó dừng do tai nạn khi bạn đóng thiết bị đầu cuối, hãy thực hiện một lần trong thiết bị đầu cuối khác như sau:

$ docker ps
$ docker restart <container>

Đợi cho đến khi quá trình tiêu diệt kết thúc ở lớp vỏ trước, sau đó đóng nó và chỉ để lại ( không thoát ra ).
Và kiểm tra lại trong thiết bị đầu cuối còn lại nếu container vẫn đang chạy:

$ docker ps

Nếu nó vẫn đang chạy, bạn có thể khởi động lại một cách an toàn và kiểm tra lại rằng ứng dụng đang khởi động lại và thấy docker của bạn sạch mà không sử dụng nhiều container.

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.