2014-12-27 27 views
5

Đối với một trong các dự án nhà của tôi, tôi quyết định sử dụng các thùng chứa docker và con số cho dàn nhạc (lần đầu tiên sử dụng các công cụ đó).fig up: docker container bắt đầu đồng bộ hóa

Đây là fig.yaml tôi:

rabbitmq: 
    image: dockerfile/rabbitmq:latest 
mongodb: 
    image: mongo 
app: 
    build: . 
    command: python /code/app/main.py 
    links: 
    - rabbitmq 
    - mongodb 
    volumes: 
    - .:/code 

RabbitMQ thời gian bắt đầu là chậm hơn nhiều so với thời điểm nộp đơn của tôi tải. Mặc dù thỏmq container bắt đầu tải đầu tiên (vì nó nằm trong liên kết ứng dụng), khi ứng dụng của tôi cố gắng kết nối với máy chủ thỏmq, nó vẫn chưa có sẵn (chắc chắn là tải vấn đề thời gian, vì nếu tôi chỉ chèn ngủ trong 5 giây trước khi kết nối với thỏmq - mọi thứ đều hoạt động tốt). Có cách nào tiêu chuẩn để giải quyết vấn đề đồng bộ hóa thời gian tải không?

Cảm ơn.

Trả lời

6

Tôi không nghĩ rằng có một cách tiêu chuẩn để giải quyết vấn đề này, nhưng đó là một vấn đề đã biết và một số người có cách giải quyết có thể chấp nhận được.

a proposal trên trình theo dõi vấn đề Docker về việc không xem xét vùng chứa như đã bắt đầu cho đến khi nó đang nghe ở cổng tiếp xúc. Tuy nhiên nó có thể sẽ không được chấp nhận do các vấn đề khác nó sẽ tạo ra ở nơi khác. Có một số fig proposal về cùng một chủ đề.

Giải pháp dễ dàng là làm giấc ngủ như @jcortejoso nói. Một ví dụ từ http://blog.chmouel.com/2014/11/04/avoiding-race-conditions-between-containers-with-docker-and-fig/:

function check_up() { 
    service=$1 
    host=$2 
    port=$3 

    max=13 # 1 minute 

    counter=1 
    while true;do 
     python -c "import socket;s = socket.socket(socket.AF_INET, socket.SOCK_STREAM);s.connect(('$host', $port))" \ 
     >/dev/null 2>/dev/null && break || \ 
     echo "Waiting that $service on ${host}:${port} is started (sleeping for 5)" 

     if [[ ${counter} == ${max} ]];then 
      echo "Could not connect to ${service} after some time" 
      echo "Investigate locally the logs with fig logs" 
      exit 1 
     fi 

     sleep 5 

     ((counter++)) 
    done 
} 

Và sau đó sử dụng check_up "DB Server" ${RABBITMQ_PORT_5672_TCP_ADDR} 5672 trước khi bắt đầu máy chủ ứng dụng của bạn, như được mô tả trong các liên kết ở trên.

Một tùy chọn khác là sử dụng docker-wait. Trong số fig.yml của bạn.

rabbitmq: 
    image: dockerfile/rabbitmq:latest 
mongodb: 
    image: mongo 
rabbitmqready: 
    image: aanand/wait 
    links: 
    - rabbitmq 
app: 
    build: . 
    command: python /code/app/main.py 
    links: 
    - rabbitmqready 
    - mongodb 
    volumes: 
    - .:/code 
1

Các sự cố tương tự Tôi đã gặp phải tôi đã giải quyết bằng cách sử dụng tập lệnh tùy chỉnh được thiết lập là CMD trong số Dockerfiles của tôi. Sau đó, bạn có thể chạy bất kỳ lệnh kiểm tra nào bạn muốn (ví dụ: sleep trong một thời gian hoặc chờ dịch vụ đang lắng nghe). Tôi nghĩ rằng đó không phải là một cách tiêu chuẩn để làm điều này, dù sao tôi nghĩ cách tốt nhất là chạy ứng dụng có thể yêu cầu dịch vụ bên ngoài hoạt động và kết nối với họ, nhưng điều này là không thể các trường hợp.

0

Đối với thử nghiệm trên CI của chúng tôi, chúng tôi xây dựng một small utility có thể được sử dụng trong một container Docker phải chờ cho các dịch vụ liên quan để sẵn sàng. Nó tự động tìm tất cả các dịch vụ TCP được liên kết từ các biến môi trường của chúng và liên tục cố gắng thiết lập các kết nối TCP cho đến khi nó thành công hoặc hết thời gian.

Chúng tôi cũng đã viết blog post describing why we built it and how we use it.

Các vấn đề liên quan