Docker Soạn chờ container X trước khi bắt đầu Y


326

Tôi đang sử dụng rabbitmq và một mẫu trăn đơn giản từ đây cùng với docker-compose. Vấn đề của tôi là tôi cần đợi rabbitmq bắt đầu hoàn toàn. Từ những gì tôi đã tìm kiếm cho đến nay, tôi không biết cách chờ đợi với container x (trong trường hợp nhân viên của tôi) cho đến khi y (rabbitmq) được bắt đầu.

Tôi tìm thấy blogpost này nơi anh ấy kiểm tra nếu máy chủ khác đang trực tuyến. Tôi cũng tìm thấy lệnh docker này :

chờ đợi

Cách sử dụng: docker chờ CONTAINER [CONTAINER ...]

Chặn cho đến khi một container dừng lại, sau đó in mã thoát của nó.

Chờ đợi một container dừng lại có thể không phải là điều tôi đang tìm kiếm nhưng nếu có, liệu có thể sử dụng lệnh đó bên trong docker-compose.yml không? Giải pháp của tôi cho đến nay là chờ vài giây và kiểm tra cổng, nhưng đây có phải là cách để đạt được điều này?. Nếu tôi không đợi tôi sẽ gặp lỗi.

docker-compose.yml

worker:
    build: myapp/.
    volumes:
    - myapp/.:/usr/src/app:ro

    links:
    - rabbitmq
rabbitmq:
    image: rabbitmq:3-management

mẫu xin chào python (rabbit.py):

import pika
import time

import socket

pingcounter = 0
isreachable = False
while isreachable is False and pingcounter < 5:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect(('rabbitmq', 5672))
        isreachable = True
    except socket.error as e:
        time.sleep(2)
        pingcounter += 1
    s.close()

if isreachable:
    connection = pika.BlockingConnection(pika.ConnectionParameters(
            host="rabbitmq"))
    channel = connection.channel()

    channel.queue_declare(queue='hello')

    channel.basic_publish(exchange='',
                          routing_key='hello',
                          body='Hello World!')
    print (" [x] Sent 'Hello World!'")
    connection.close()

Dockerfile cho công nhân:

FROM python:2-onbuild
RUN ["pip", "install", "pika"]

CMD ["python","rabbit.py"]

Cập nhật tháng 11 năm 2015 :

Một kịch bản shell hoặc chờ đợi bên trong chương trình của bạn có thể là một giải pháp khả thi. Nhưng sau khi thấy vấn đề này, tôi đang tìm kiếm một lệnh hoặc tính năng của docker / docker-compose chính nó.

Họ đề cập đến một giải pháp để thực hiện kiểm tra sức khỏe, có thể là lựa chọn tốt nhất. Kết nối tcp mở không có nghĩa là dịch vụ của bạn đã sẵn sàng hoặc có thể vẫn sẵn sàng. Ngoài ra, tôi cần thay đổi điểm vào trong dockerfile của mình.

Vì vậy, tôi hy vọng câu trả lời với docker-compose trên bảng lệnh, hy vọng sẽ có trường hợp nếu họ hoàn thành vấn đề này.

Cập nhật tháng 3 năm 2016

Có một đề xuất cung cấp một cách tích hợp để xác định xem một container có còn "sống" hay không. Vì vậy, docker-compose có thể sử dụng nó trong tương lai gần.

Cập nhật tháng 6 năm 2016

Có vẻ như Healthcheck sẽ được tích hợp vào docker trong Phiên bản 1.12.0

Cập nhật tháng 1 năm 2017

Tôi tìm thấy một giải pháp soạn thảo docker xem: Docker Compose chờ container X trước khi bắt đầu Y


2
Sử dụng kiểm tra sức khỏe trong đã không được chấp nhận trong docker-compose 2.3 để khuyến khích làm cho hệ thống phân tán có khả năng chịu lỗi. Xem: docs.docker.com/compose/startup-order
Kmaid

Câu trả lời:


284

Cuối cùng tìm thấy một giải pháp với một phương pháp soạn thảo docker. Vì định dạng tập tin Docker-soạn 2.1 bạn có thể xác định healthchecks .

Tôi đã làm điều đó trong một dự án ví dụ bạn cần cài đặt ít nhất là docker 1.12.0+. Tôi cũng cần phải mở rộng Dockerfile quản lý rabbitmq , vì curl không được cài đặt trên hình ảnh chính thức.

Bây giờ tôi kiểm tra xem trang quản lý của rabbitmq-container có sẵn không. Nếu curl kết thúc với mã thoát 0, ứng dụng container (python pika) sẽ được khởi động và xuất bản một thông báo để chào hàng. Bây giờ nó làm việc (đầu ra).

docker-compose (phiên bản 2.1):

version: '2.1'

services:
  app:
    build: app/.
    depends_on:
      rabbit:
        condition: service_healthy
    links: 
        - rabbit

  rabbit:
    build: rabbitmq/.
    ports: 
        - "15672:15672"
        - "5672:5672"
    healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost:15672"]
        interval: 30s
        timeout: 10s
        retries: 5

đầu ra:

rabbit_1  | =INFO REPORT==== 25-Jan-2017::14:44:21 ===
rabbit_1  | closing AMQP connection <0.718.0> (172.18.0.3:36590 -> 172.18.0.2:5672)
app_1     |  [x] Sent 'Hello World!'
healthcheckcompose_app_1 exited with code 0

Dockerfile (rabbitmq + curl):

FROM rabbitmq:3-management
RUN apt-get update
RUN apt-get install -y curl 
EXPOSE 4369 5671 5672 25672 15671 15672

Phiên bản 3 không còn hỗ trợ các hình thức điều kiện của depends_on . Vì vậy, tôi đã chuyển từ phụ thuộc vào để khởi động lại thất bại. Bây giờ bộ chứa ứng dụng của tôi sẽ khởi động lại 2-3 lần cho đến khi nó hoạt động, nhưng nó vẫn là một tính năng soạn thảo docker mà không ghi đè lên điểm nhập cảnh.

docker-compose (phiên bản 3):

version: "3"

services:

  rabbitmq: # login guest:guest
    image: rabbitmq:management
    ports:
    - "4369:4369"
    - "5671:5671"
    - "5672:5672"
    - "25672:25672"
    - "15671:15671"
    - "15672:15672"
    healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost:15672"]
        interval: 30s
        timeout: 10s
        retries: 5

  app:
    build: ./app/
    environment:
      - HOSTNAMERABBIT=rabbitmq
    restart: on-failure
    depends_on:
      - rabbitmq
    links: 
        - rabbitmq

6
@svenhornberg pingsử dụng ICMP nên không hỗ trợ cổng TCP. Có lẽ ncđể kiểm tra một cổng TCP. Có lẽ tốt hơn để sử dụng psql -h localhost -p 5432và truy vấn một cái gì đó.
Matt

36
"phụ thuộc vào" đã bị xóa trong phiên bản 3 docs.docker.com/compose/compose-file/#dependson
nha

48
@nha Có vẻ như conditionhình thức depends_onđã bị xóa, nhưng depends_onbản thân nó vẫn còn tồn tại trong v3
akivajgordon

14
Làm thế nào có thể healthchecks vẫn được sử dụng để kiểm soát khởi động để nếu depends_onconditionđã được gỡ bỏ?
Franz

43
Khó có thể tin đây vẫn là một nỗi đau
npr

71

Điều đó là không thể, chưa. Xem thêm yêu cầu tính năng này .

Cho đến nay bạn cần phải làm điều đó trong các thùng chứa của bạn CMDđể đợi cho đến khi tất cả các dịch vụ cần thiết ở đó.

Trong Dockerfiles CMDbạn có thể tham khảo kịch bản bắt đầu của riêng bạn mà kết thúc tốt đẹp khởi động tuyến vận chuyển container của bạn. Trước khi bạn bắt đầu nó, bạn chờ đợi một tùy thuộc như:

Dockerfile

FROM python:2-onbuild
RUN ["pip", "install", "pika"]
ADD start.sh /start.sh
CMD ["/start.sh"]

bắt đầu

#!/bin/bash
while ! nc -z rabbitmq 5672; do sleep 3; done
python rabbit.py

Có lẽ bạn cũng cần phải cài đặt netcat Dockerfile. Tôi không biết những gì được cài đặt sẵn trên hình ảnh con trăn.

Có một vài công cụ hiện có cung cấp logic chờ sử dụng dễ dàng, để kiểm tra cổng tcp đơn giản:

Đối với chờ đợi phức tạp hơn:


Bạn có thể giải thích những gì bạn có nghĩa là CMD? Điều này có nghĩa là chương trình của tôi phải làm điều đó, giống như tôi đã làm với kiểm tra cổng? Hay bạn có nghĩa là một CMD cụ thể từ ví dụ linux cho điều này?
svenhornberg

cảm ơn bạn đã giải thích, tôi nêu lên câu trả lời của bạn. Nhưng tôi nghĩ rằng yêu cầu tính năng sắp tới, sẽ là câu trả lời đúng cho câu hỏi của tôi vì vậy tôi không trả lời cho đến nay.
svenhornberg

44

Sử dụng restart: unless-stoppedhoặc restart: alwayscó thể giải quyết vấn đề này.

Nếu worker containerdừng lại khi rabbitMQ chưa sẵn sàng, nó sẽ được khởi động lại cho đến khi nó được.


3
Tôi thích giải pháp này cho trường hợp này, nhưng nó không hoạt động đối với các container không thoát khi một trong các quy trình con chạy không thành công. Ví dụ, một thùng chứa Tomcat sẽ tiếp tục chạy ngay cả khi một máy chủ Java mà nó chạy không thể kết nối với máy chủ cơ sở dữ liệu. Được cấp, các container Docker kết xuất các container servlet như Tomcat hầu như không cần thiết.
Derek Mahar

@DerekMahar, nếu bạn có một ứng dụng web dựa trên Java chỉ phục vụ các cuộc gọi REST, bạn sẽ sử dụng cái gì thay vì Jetty / Tomcat?
JoeG

2
@JoeG, ý tôi là Tomcat thùng chứa servlet có thể lưu trữ nhiều ứng dụng, không nhúng Tomcat. Docker làm cho cái trước hầu như không cần thiết, trong khi làm cho cái sau trở nên phổ biến hơn cho microservice chẳng hạn.
Derek Mahar

35

Gần đây họ đã thêm depends_ontính năng này .

Biên tập:

Kể từ phiên bản soạn thảo 2.1+, bạn có thể sử dụng depends_onkết hợp với healthcheckđể đạt được điều này:

Từ các tài liệu :

version: '2.1'
services:
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
  redis:
    image: redis
  db:
    image: redis
    healthcheck:
      test: "exit 0"

Trước phiên bản 2.1

Bạn vẫn có thể sử dụng depends_on, nhưng nó chỉ ảnh hưởng đến thứ tự bắt đầu dịch vụ - không phải nếu chúng sẵn sàng trước khi dịch vụ phụ thuộc được bắt đầu.

Nó dường như yêu cầu ít nhất phiên bản 1.6.0.

Cách sử dụng sẽ trông giống như thế này:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres 

Từ các tài liệu:

Thể hiện sự phụ thuộc giữa các dịch vụ, có hai tác dụng:

  • docker-compose up sẽ bắt đầu các dịch vụ theo thứ tự phụ thuộc. Trong ví dụ sau, db và redis sẽ được khởi động trước web.
  • Docker-compose up DỊCH VỤ sẽ tự động bao gồm các phụ thuộc của DỊCH VỤ. Trong ví dụ sau, web soạn thảo docker cũng sẽ tạo và bắt đầu db và redis.

Lưu ý: Theo tôi hiểu, mặc dù điều này không đặt thứ tự các container được tải. Nó không đảm bảo rằng dịch vụ bên trong container đã thực sự được tải.

Ví dụ, bạn postgres container có thể lên. Nhưng bản thân dịch vụ postgres vẫn có thể được khởi tạo trong container.


10
dnephin đã viết: phụ thuộc vào chỉ đặt hàng. Để thực sự trì hoãn việc bắt đầu một container khác, cần phải có một số cách để phát hiện khi một quá trình đã tự khởi tạo xong.
svenhornberg

15
"Phiên bản 3 không còn hỗ trợ hình thức điều kiện depends_on." docs.docker.com/compose/compose-file/#dependson
akauppi

depends_onkhông đợi cho đến khi container ở readytrạng thái (bất cứ điều gì có thể có nghĩa trong trường hợp của bạn). Nó chỉ đợi cho đến khi container ở trạng thái 'đang chạy'.
htyagi

19

bạn cũng có thể chỉ cần thêm nó vào tùy chọn lệnh, vd.

command: bash -c "sleep 5; start.sh"

https://github.com/docker/compose/issues/374#issuecomment-156546513

chờ đợi trên một cổng bạn cũng có thể sử dụng một cái gì đó như thế này

command: bash -c "while ! curl -s rabbitmq:5672 > /dev/null; do echo waiting for xxx; sleep 3; done; start.sh"

để tăng thời gian chờ đợi, bạn có thể hack thêm một chút:

command: bash -c "for i in {1..100} ; do if ! curl -s rabbitmq:5672 > /dev/null ; then echo waiting on rabbitmq for $i seconds; sleep $i; fi; done; start.sh"

13

restart: on-failure đã lừa tôi .. xem bên dưới

---
version: '2.1'
services:
  consumer:
    image: golang:alpine
    volumes:
      - ./:/go/src/srv-consumer
    working_dir: /go/src/srv-consumer
    environment:
      AMQP_DSN: "amqp://guest:guest@rabbitmq:5672"
    command: go run cmd/main.go
    links:
          - rabbitmq
    restart: on-failure

  rabbitmq:
    image: rabbitmq:3.7-management-alpine
    ports:
      - "15672:15672"
      - "5672:5672"

12

Đối với container bắt đầu sử dụng đặt hàng

depends_on:

Để chờ container trước bắt đầu sử dụng tập lệnh

entrypoint: ./wait-for-it.sh db:5432

Bài viết này sẽ giúp bạn https://docs.docker.com/compose/startup-order/


5
@svenhornberg trong bình luận, bạn liên kết, không có lời giải thích nào về tính năng Wait-for-it.sh.
bỏ

7

Bạn cũng có thể giải quyết điều này bằng cách đặt điểm cuối chờ dịch vụ tăng lên bằng cách sử dụng netcat (sử dụng docker-Wait tập lệnh ). Tôi thích cách tiếp cận này vì bạn vẫn có một commandphần rõ ràng trong bạn docker-compose.ymlvà bạn không cần thêm mã cụ thể của docker vào ứng dụng của mình:

version: '2'
services:
  db:
    image: postgres
  django:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    entrypoint: ./docker-entrypoint.sh db 5432
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

Sau đó của bạn docker-entrypoint.sh :

#!/bin/sh

postgres_host=$1
postgres_port=$2
shift 2
cmd="$@"

# wait for the postgres docker to be running
while ! nc $postgres_host $postgres_port; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

>&2 echo "Postgres is up - executing command"

# run the command
exec $cmd

Điều này ngày nay được ghi nhận trong tài liệu chính thức của docker .

PS: Bạn nên cài đặt netcattrong ví dụ docker của bạn nếu điều này không có sẵn. Để làm như vậy, thêm điều này vào Dockertập tin của bạn :

RUN apt-get update && apt-get install netcat-openbsd -y 

4

Có một tiện ích sẵn sàng để sử dụng gọi là " docker-Wait " có thể được sử dụng để chờ.


1
Cảm ơn bạn, nhưng nó chỉ là một kịch bản shell nên nó giống như câu trả lời của h3nrik hoặc chờ đợi bên trong python. Nó không phải là một tính năng của docker-compose chính nó. Bạn có thể xem github.com/docker/compose/issues/374 họ dự định thực hiện kiểm tra sức khỏe sẽ là cách tốt nhất. Kết nối tcp mở không có nghĩa là dịch vụ của bạn đã sẵn sàng hoặc có thể vẫn sẵn sàng. Ngoài ra, tôi cần thay đổi điểm vào trong dockerfile của mình.
svenhornberg

3

Đã thử nhiều cách khác nhau, nhưng thích sự đơn giản của việc này: https://github.com/ufoscout/docker-compose-wait

Ý tưởng rằng bạn có thể sử dụng các lọ ENV trong tệp soạn thảo docker để gửi danh sách các máy chủ dịch vụ (có cổng) sẽ được "chờ" như thế này : WAIT_HOSTS: postgres:5432, mysql:3306, mongo:27017.

Vì vậy, giả sử bạn có tệp docker-compose.yml sau (sao chép / quá khứ từ repo README ):

version: "3"

services:

  mongo:
    image: mongo:3.4
    hostname: mongo
    ports:
      - "27017:27017"

  postgres:
    image: "postgres:9.4"
    hostname: postgres
    ports:
      - "5432:5432"

  mysql:
    image: "mysql:5.7"
    hostname: mysql
    ports:
      - "3306:3306"

  mySuperApp:
    image: "mySuperApp:latest"
    hostname: mySuperApp
    environment:
      WAIT_HOSTS: postgres:5432, mysql:3306, mongo:27017

Tiếp theo, để các dịch vụ chờ, bạn cần thêm hai dòng sau vào Dockerfiles của bạn (vào Dockerfile của các dịch vụ sẽ chờ các dịch vụ khác bắt đầu):

ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.5.0/wait /wait
RUN chmod +x /wait

Ví dụ đầy đủ về Dockerfile mẫu như vậy (một lần nữa từ dự án repo README ):

FROM alpine

## Add your application to the docker image
ADD MySuperApp.sh /MySuperApp.sh

## Add the wait script to the image
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.5.0/wait /wait
RUN chmod +x /wait

## Launch the wait tool and then your application
CMD /wait && /MySuperApp.sh

Để biết chi tiết khác về cách sử dụng có thể, xem README


Tôi đang tìm kiếm câu trả lời tương tự. Tôi thường làm việc với hub.docker.com/r/dadarek/wait-for-dependencies vì nó sử dụng netcat bên dưới. Thứ bạn cung cấp là dựa trên Rust. Không thể nhận xét về chất lượng của bạn, nhưng đối với tôi không có lớp bổ sung nào là chuyên nghiệp nhất định.
Filip Malczak

1
Tôi thực sự khuyên bạn nên chống lại điều này với lý do an ninh. Bạn đang chạy một thực thi tùy ý từ một siêu liên kết. Một giải pháp tốt hơn là làm điều tương tự với một tập lệnh tĩnh được sao chép vào hình ảnh bằng COPY
Paul K

@PaulK tất nhiên, có thể hiểu rằng việc chạy bất cứ thứ gì từ siêu liên kết là không an toàn, nhưng đó chỉ là một bản demo ở trên để làm cho https://github.com/ufoscout/docker-compose-waitthư viện hoạt động :) Cách bạn sử dụng thư viện đó không thay đổi câu trả lời mà bạn có thể sử dụng một số lib. Bảo mật là một chủ đề phức tạp và nếu chúng ta đi xa, chúng ta nên kiểm tra xem thư viện đó đang làm gì bên trong, ngay cả khi chúng ta SAO CHÉP :) Vì vậy, tốt hơn là nên cụ thể hơn trong nhận xét của bạn như: "Tôi thực sự khuyên bạn nên sử dụng thư viện đó từ siêu liên kết ". Hy vọng bạn đồng ý, cảm ơn cho một gợi ý!
Evereq

2

dựa trên bài đăng trên blog này https://8thlight.com/blog/dariusz-pasciak/2016/10/17/docker-compose-wait-for-dependencies.html

Tôi cấu hình của tôi docker-compose.ymlnhư hiển thị dưới đây:

version: "3.1"

services:
  rabbitmq:
    image: rabbitmq:3.7.2-management-alpine
    restart: always
    environment:
      RABBITMQ_HIPE_COMPILE: 1
      RABBITMQ_MANAGEMENT: 1
      RABBITMQ_VM_MEMORY_HIGH_WATERMARK: 0.2
      RABBITMQ_DEFAULT_USER: "rabbitmq"
      RABBITMQ_DEFAULT_PASS: "rabbitmq"
    ports:
      - "15672:15672"
      - "5672:5672"
    volumes:
      - data:/var/lib/rabbitmq:rw

  start_dependencies:
    image: alpine:latest
    links:
      - rabbitmq
    command: >
      /bin/sh -c "
        echo Waiting for rabbitmq service start...;
        while ! nc -z rabbitmq 5672;
        do
          sleep 1;
        done;
        echo Connected!;
      "

volumes:
  data: {}

Sau đó, tôi làm để chạy =>:

docker-compose up start_dependencies

rabbitmqDịch vụ sẽ bắt đầu trong chế độ daemon, start_dependenciessẽ hoàn thành công việc.


lol, thực hiện truy vấn thông qua "curl", "-f", "http://localhost:15672"đó bạn cần cài đặt managementplugin và sử dụng Healthcheck đã không dùng nữa - câu trả lời tốt nhất của nó. Ví dụ làm việc đơn giản với kiểm tra thông qua nc- downvote của nó. ha, ok ...
Igor Komar

câu trả lời không sử dụng tính năng docker gốc, không liên quan nếu bạn sử dụng curl, nc hoặc các công cụ khác. trong khi! nc giống như đã được đăng trong các câu trả lời khác.
svenhornberg


1
@IgorKomar, cảm ơn bạn, bạn đã cứu ngày của tôi! : 3 Tôi đã sử dụng gần như cùng một thợ máy để kiểm tra máy chủ mysql đã sẵn sàng trước khi ứng dụng thực tế được bắt đầu. ;) Tôi đang chuyển lệnh tương tự đếndocker-compose run --name app-test --rm "app" bash -l -c 'echo Waiting for mysql service start... && while ! nc -z db-server 3306; do sleep 1; done && echo Connected! && /bin/bash /script/ci_tests.sh'
TooroSan

1

Trong phiên bản 3 của tệp Docker Compose, bạn có thể sử dụng RESTART .

Ví dụ:

docker-compose.yml

worker:
    build: myapp/.
    volumes:
    - myapp/.:/usr/src/app:ro
    restart: on-failure
    depends_on:
    - rabbitmq
rabbitmq:
    image: rabbitmq:3-management

Lưu ý rằng tôi đã sử dụng phụ thuộc thay vì liên kết vì sau này không được dùng trong phiên bản 3.

Mặc dù nó hoạt động, nó có thể không phải là giải pháp lý tưởng vì bạn khởi động lại container docker mỗi khi thất bại.

Hãy xem RESTART_POLICY là tốt. nó cho phép bạn tinh chỉnh chính sách khởi động lại.

Khi bạn sử dụng Compose trong sản xuất , thực tế tốt nhất là sử dụng chính sách khởi động lại:

Chỉ định chính sách khởi động lại như khởi động lại: luôn để tránh thời gian chết


0

Một trong những giải pháp thay thế là sử dụng giải pháp điều phối container như Kubernetes. Kubernetes có hỗ trợ cho các container init chạy đến khi hoàn thành trước khi các container khác có thể bắt đầu. Bạn có thể tìm thấy một ví dụ ở đây với bộ chứa SQL Server 2017 Linux nơi bộ chứa API sử dụng bộ chứa init để khởi tạo cơ sở dữ liệu

https://www.handsonarchitect.com/2018/08/understand-kubernetes-object-init.html


0

Dưới đây là ví dụ về nơi maincontainer chờ đợi workerkhi nó bắt đầu phản hồi cho ping:

version: '3'
services:
  main:
    image: bash
    depends_on:
     - worker
    command: bash -c "sleep 2 && until ping -qc1 worker; do sleep 1; done &>/dev/null"
    networks:
      intra:
        ipv4_address: 172.10.0.254
  worker:
    image: bash
    hostname: test01
    command: bash -c "ip route && sleep 10"
    networks:
      intra:
        ipv4_address: 172.10.0.11
networks:
  intra:
    driver: bridge
    ipam:
      config:
      - subnet: 172.10.0.0/24

Tuy nhiên, cách thích hợp là sử dụng healthcheck(> = 2.1).


0

Không được đề xuất cho các triển khai nghiêm túc, nhưng về cơ bản, đây là lệnh "chờ x giây".

Với docker-composephiên bản, 3.4một start_periodhướng dẫn đã được thêm vàohealthcheck . Điều này có nghĩa là chúng ta có thể làm như sau:

docker-compose.yml:

version: "3.4"
services:
  # your server docker container
  zmq_server:
    build:
      context: ./server_router_router
      dockerfile: Dockerfile

  # container that has to wait
  zmq_client:
    build:
      context: ./client_dealer/
      dockerfile: Dockerfile
    depends_on:
      - zmq_server
    healthcheck:
      test: "sh status.sh"
      start_period: 5s

status.sh:

#!/bin/sh

exit 0

Điều xảy ra ở đây là healthcheckđược gọi sau 5 giây. Điều này gọi status.shkịch bản, luôn trả về "Không có vấn đề". Chúng tôi chỉ cần làm zmq_clientcontainer chờ 5 giây trước khi bắt đầu!

Lưu ý: Điều quan trọng là bạn có version: "3.4". Nếu .4không có, docker-compose phàn nàn.


1
Là một giải pháp "chờ 5s" ngây thơ, điều này khá khéo léo. Tôi sẽ ủng hộ, nhưng tôi sẽ không vì điều này không thực sự hiệu quả với các thiết lập giống như prod và tôi sợ rằng ai đó sẽ nhìn vào số phiếu thay vì đọc kỹ. Tuy nhiên, tôi muốn nói "đàn ông, thật thông minh";)
Filip Malczak

Tái bút Để biết các giải pháp phức tạp hơn, hãy xem câu trả lời của Evereq
Filip Malczak

Đó không phải là những gì start_period. Cấu hình đó có nghĩa là có một giai đoạn ân hạn trong đó kiểm tra sức khỏe thất bại không được tính là thử lại. Nếu nó thành công sớm, nó được coi là khỏe mạnh. Sau giai đoạn bắt đầu, một thất bại sẽ được tính là thử lại. Xem docs.docker.com/engine/reference/builder/#healthcheck
Capi Etheriel

-4

Tôi chỉ có 2 tập tin soạn thảo và bắt đầu một tập tin thứ nhất và thứ hai sau đó. Kịch bản của tôi trông như thế:

#!/bin/bash
#before i build my docker files
#when done i start my build docker-compose
docker-compose -f docker-compose.build.yaml up
#now i start other docker-compose which needs the image of the first
docker-compose -f docker-compose.prod.yml up

Đây không được coi là một thực hành tốt. Bạn không thể cung cấp giải pháp bao gồm nhiều conatiners từ một tệp soạn thảo sau đó.
juergi
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.