Làm thế nào để chạy docker-compile up -d khi khởi động hệ thống?


114

Để cho phép các vùng chứa tự động khởi động tại điểm khởi động, tôi đã thử thêm lệnh:

cd directory_has_docker-compose.yml && docker-compose up -d trong /etc/rc.local.

nhưng sau khi tôi khởi động lại máy, các thùng chứa không hoạt động.

Làm thế nào để chạy docker-compose up -dkhi khởi động hệ thống?


3
sử dụng --restart alwayshoặc --restart unless-stoppedtrong việc sử dụng docker -omp.yml restart: always-> Tham khảo . Nhưng có thể không hoạt động trên một số vùng chứa!
Benyamin Jafari

Câu trả lời:


129

Khi chúng tôi sử dụng crontabhoặc /etc/rc.localtệp không dùng nữa , chúng tôi cần một khoảng thời gian trễ (ví dụ: sleep 10tùy thuộc vào máy) để đảm bảo rằng các dịch vụ hệ thống có sẵn. Thông thường, systemd(hoặc upstart) được sử dụng để quản lý dịch vụ nào bắt đầu khi hệ thống khởi động. Bạn có thể thử sử dụng cấu hình tương tự cho việc này:

# /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

Hoặc, nếu bạn muốn chạy mà không có -dcờ:

# /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0
Restart=on-failure
StartLimitIntervalSec=60
StartLimitBurst=3

[Install]
WantedBy=multi-user.target

Thay đổi WorkingDirectorythông số với đường dẫn dự án dày đặc của bạn. Và cho phép dịch vụ bắt đầu tự động:

systemctl enable docker-compose-app

Có cách nào đơn giản để kiểm tra xem nó có hoạt động mà không cần khởi động lại raspberry không?
dmigo

2
Đây là câu trả lời thanh lịch nhất IMO
kuzyn

2
@dmigo systemctl start docker-compose-appsystemctl status docker-compose-apptôi nghĩ là bạn đang tìm kiếm.
HectorJ

không có tác dụng đối với tôi, khi tôi chạy systemctl start docker-compose-appgặp phải với điều này:Job for docker-compose-app.service failed because the control process exited with error code. See "systemctl status docker-compose-app.service" and "journalctl -xe" for details
Benyamin Jafari

1
@dmigo: thử khởi động dịch vụ của bạn với service docker-compose-app startservice docker-compose-app statusservice docker-compose-app stop
:,

96

Bạn sẽ có thể thêm:

restart: always 

cho mọi dịch vụ bạn muốn khởi động lại trong tệp docker-compost.yml


6
Hãy nhớ rằng chúng phải chạy khi khởi động lại xảy ra, vì vậy đừng dừng chúng theo cách thủ công trước khi khởi động lại.
Tom

một số dịch vụ như Nginx thậm chí không bắt đầu với tùy chọn này.
Benyamin Jafari

15
Đây là câu trả lời thích hợp cho câu hỏi. Có một cách được thiết kế để khởi động lại các thùng chứa, tại sao lại tham gia vào các công việc cron và những cách khác để phát minh lại bánh xe.
Taha Rehman Siddiqui

Đây là câu trả lời đúng. Khi bạn bắt đầu sử dụng Kubernetes thay vì cron, bạn sẽ rất vui vì đã sử dụng nó.
pferrel

9
@TahaRehmanSiddiqui Lưu ý rằng restart: alwayscó một số lỗi nghiêm trọng: ví dụ: giá treo máy chủ sẽ không được đính kèm khi khởi động lại. Theo tôi, tốt hơn hết là nên phát minh lại bánh xe, nếu bánh xe hiện tại là hình vuông.
okdewit

73

Nếu bạn docker.serviceđã bật khi khởi động hệ thống

$ sudo systemctl enable docker

và các dịch vụ của bạn trong docker-compose.yml

restart: always

tất cả các dịch vụ chạy khi bạn khởi động lại hệ thống của mình nếu bạn chỉ chạy lệnh dưới đây một lần

docker-compose up -d

2
đây phải là giải pháp thanh lịch nhất
Carl Cheung

34

Tôi đã thử restart: always , nó hoạt động ở một số vùng chứa (như php-fpm), nhưng tôi gặp phải vấn đề là một số vùng chứa (như nginx) vẫn không khởi động lại sau khi khởi động lại.

Đã giải quyết vấn đề.

crontab -e

@reboot (sleep 30s ; cd directory_has_dockercomposeyml ; /usr/local/bin/docker-compose up -d )&

2
Tại sao lại phản đối cho câu trả lời này? Câu trả lời có hữu ích không? Nó sai theo nghĩa nào? Một nhận xét sẽ hữu ích trong việc cho người trả lời và những người khác biết điều gì sai.
Ayushya 20/07/17

5
Bạn nên suspicuous của ngủ trần khi họ giới thiệu hành vi không xác định: martinfowler.com/articles/...
giorgiosironi

@giorgiosironi sleep ổn trong trường hợp này. Dù sao thì khởi động vùng chứa cũng phải có khả năng xử lý hành vi không xác định.
z0r

4
Nó cũng giới thiệu độ trễ lên đến 30 giây có thể không cần thiết.
giorgiosironi

@ z0r ngủ không ổn! Giấc ngủ có thể "hoạt động" nhưng bất kỳ trình tự khởi động nào cũng phải mang tính xác định. Các dịch vụ Linux sử dụng các phụ thuộc để đảm bảo những thứ như mạng khả dụng, v.v. trước khi chúng bắt đầu. Bạn nên làm như vậy.
colm.anseo

25

Sử dụng khởi động lại: luôn có trong tệp soạn thư docker của bạn.

Docker-compose up -dsẽ khởi chạy lại vùng chứa từ hình ảnh. Sử dụng docker-compose startđể bắt đầu các vùng chứa đã dừng, nó không bao giờ khởi chạy các vùng chứa mới từ hình ảnh.

nginx:   
    restart: always   
    image: nginx   
    ports:
      - "80:80"
      - "443:443"   links:
      - other_container:other_container

Ngoài ra, bạn có thể viết mã lên tệp docker để nó được tạo trước, nếu nó có sự phụ thuộc của các vùng chứa khác.


1
Bạn có thể không muốn sử dụng always, nhưng có thể unless-stopped. Các tùy chọn khác là on-failureno. Đây được gọi là chính sách khởi động lại .
Paul

5

Như một phần bổ sung cho user39544câu trả lời của, một loại cú pháp khác cho crontab -e:

@reboot sleep 60 && /usr/local/bin/docker-compose -f /path_to_your_project/docker-compose.yml up -d

Điều này đã làm việc cho tôi vào tháng 3 năm 2018 trên RPi3 chạy Raspian. Tôi chạy crontab -evới tư cách là người dùng pi, với pi là thành viên của nhóm docker ...
Scott Veirs
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.