2016-05-10 33 views
8

Tôi muốn sử dụng docker-compose để soạn cùng php và một số cơ sở dữ liệu (orientdb, neo4j, vv). Sau đó vào thùng chứa php và sử dụng trình bao để thực hiện các lệnh.Giữ bình chứa còn sống và được liên kết bằng Docker-soạn

Cá nhân, tất cả các thùng chứa của tôi hoạt động bơi lội và khi tôi tổng hợp chúng lại với nhau, tất cả đều chạy. Tuy nhiên, tôi không thể cho cuộc sống của tôi tìm ra cách giữ container php còn sống để tôi có thể tham gia vào nó để thử nghiệm.

Để đơn giản, tôi sẽ chỉ sử dụng một cơ sở dữ liệu duy nhất: orient-db.

My docker-compose.yml file:

version: '2' 
services: 
    php: 
    build: . 
    links: 
     - orientdb 

    orientdb: 
    image: orientdb:latest 
    environment: 
     ORIENTDB_ROOT_PASSWORD: rootpwd 
    ports: 
     - "2424:2424" 
     - "2480:2480" 

của tôi "php" Dockerfile:

FROM php:5.6-cli 
ADD . /spider 
WORKDIR /spider 
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer 
RUN composer install --prefer-source --no-interaction 

RUN yes | pecl install xdebug \ 
    && echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini 

Tôi đã cố gắng (trong số những thứ khác):

  • docker-compose up trong một thiết bị đầu cuối và sau đó docker attach trong một số khác
  • phép ttystdin_open trong tập tin soạn của tôi
  • sử dụng một lệnh /bin/bash
  • biến thể của CMD exec vendor/bin/phpunit -D FOREGROUND

Và một số tài liệu tham khảo tôi đã cố gắng: - How to Keep Docker Container Running After Starting Services? - https://github.com/docker/compose/issues/1926 - https://github.com/docker/compose/issues/423

Bất kỳ giúp đỡ thực sự sẽ được đánh giá cao.

Cảm ơn bạn.

+0

Vui lòng thêm bột nhão của nhật ký của vùng chứa PHP. Chúng ta cần phải xem nó chết như thế nào. – L0j1k

+0

@ L0j1k Khi tôi chạy 'docker logs , tất cả những gì tôi nhận được là' Interactive Shell'. Vùng chứa đang được xây dựng chính xác, chỉ cần thoát ngay khi xong. Tôi cần một lệnh để chạy nó sẽ mở nó. Tôi đã thử câu trả lời @tfg nhưng không đi xa đến vậy – Apollo

+1

hãy xem tại đây - chỉ cần tìm một công thức đơn giản và hoạt động: http://stackoverflow.com/a/38292749/1329943 –

Trả lời

10

So-soạn Docker chỉ là một stand-in cho khách hàng Docker động cơ.Nó duy trì tính chẵn lẻ tính năng với khách hàng. Để chẩn đoán vấn đề như thế này, bạn nên thả việc sử dụng docker-compose cho đến khi bạn làm việc với máy khách ole thông thường. Dựa trên ý kiến ​​của bạn ở đây và trên câu trả lời khác, nó chỉ có vẻ như bạn đang không chạy một container với một quá trình daemon ở phía trước. Nếu bạn muốn chạy một trình bao tương tác trong Docker, bạn phải sử dụng các cờ -it (-t phân bổ một tty và -i khởi tạo một phiên tương tác). Nếu bạn không chạy Docker với các thiết bị chuyển mạch đó, vùng chứa của bạn sẽ không tồn tại khi bạn bắt đầu một trình tương tác, ví dụ: php -a.

Nó giúp nghĩ Docker là một cách ưa thích để chạy một quy trình chứ không phải máy ảo. Nó không phải là một số "môi trường" tồn tại bên ngoài cuộc đời của bất kỳ quá trình (và con cái của nó) bạn đang chạy. Thông thường, PHP được gọi bởi một số máy chủ (ví dụ: Apache, Nginx, v.v.). Điều bạn ngụ ý ở đây là bạn cần một tiến trình PHP để chạy "vĩnh viễn" để bạn có thể thả vào thùng chứa và kiểm tra một số thứ. Ngoại trừ vỏ tương tác, điều đó sẽ không thể thực hiện được, và bạn cần đặc biệt sử dụng công tắc -it để giữ cho quy trình vỏ tương tác còn sống trong vùng chứa của bạn. Câu trả lời thực sự ở đây là bạn không thể làm những gì bạn đang cố gắng làm ở đây (giữ một thùng chứa PHP đang chạy) mà không cần một số tiến trình daemon/máy chủ có liên quan lắng nghe ở nền trước. Lý do là vì đó không phải là cách PHP hoạt động. Nếu bạn thực sự muốn nhận được vào một container từ hình ảnh PHP của bạn, chỉ cần thả vào một cái vỏ vào nó:

docker run -it apollo/php /bin/bash 

... Và bạn sẽ bắt đầu một container từ hình ảnh PHP của bạn, và nhận được một vỏ trên thùng chứa (sẽ chết ngay khi bạn thoát khỏi vỏ). Nhưng một lần nữa, chỉ nhắc lại từ đoạn đầu tiên của tôi, docker-compose không phải là cách để đi đến đây.

+0

Điều đó tạo ra rất nhiều ý nghĩa, và đó là điều tôi lo sợ. Tôi có thể nhận được php để ở lại mở bằng cách sử dụng cờ. Tôi chỉ hy vọng tôi có thể sử dụng soạn nhạc để liên kết các thùng chứa của tôi với nhau. Vùng chứa php cần có khả năng giao tiếp với vùng chứa orientdb. Đó có thể là một câu hỏi riêng biệt – Apollo

+0

Bạn đã cân nhắc FROM'ing vùng chứa OrientDB của mình và cài đặt PHP bên trong nó chưa? Đây là những gì tôi sẽ làm. – L0j1k

+1

Đó là một ý tưởng tuyệt vời. Nếu có một số cơ sở dữ liệu, tôi chỉ cần làm điều này một lần - bên trong một thùng chứa vẫn còn sống. Những người khác có thể được liên kết với nó. – Apollo

5

Nếu bạn chạy với docker-compose up và không có lỗi nào được in vào thiết bị đầu cuối thì nó cho thấy dịch vụ dừng lại vì dịch vụ này kết thúc (ngược với việc gặp phải một số lỗi).

Một nguyên nhân có thể gây ra lỗi là bạn đang gửi nội dung tới PHP (cài đặt trình soạn nhạc) sẽ giết thiết bị đầu cuối php tương tác được kích hoạt bởi hình ảnh php:5.6-cli. Để khởi động shell php tương tác một lần nữa thêm dòng sau vào cuối Dockerfile của bạn:

CMD ["php", "-a"]

và thử lại với docker-compose up

Sidenote: khi mọi thứ đang chạy đúng cách bạn có thể chạy docker-compose up -d để chạy trong chế độ daemon, cho phép bạn kiểm soát thiết bị đầu cuối của bạn một lần nữa (tất cả stdout + stderr sẽ được ghi lại trong các tệp log tương ứng của vùng chứa docker).

Sau đó, bạn có thể đính kèm vào vùng chứa để làm việc của mình. Tôi luôn thấy rằng docker exec -it <containerID> bash nhanh hơn docker attach <container id>

Hy vọng điều này sẽ hữu ích.

+0

Vâng, tôi đã thử với một số biến thể, nhưng không đi. Bạn đúng rồi. Khi tôi chạy 'docker ps -a' nó hiển thị php như đã thoát. – Apollo

+0

Và tôi đã thử thêm 'lệnh: [" ngủ "," 60 "]' vào tệp yml của tôi và nó giữ cho vùng chứa mở trong toàn bộ phút, trong thời gian đó tôi có thể 'exec' trong lệnh – Apollo

+3

:" đuôi - f/dev/null "sẽ giữ một thùng chứa chạy suốt thời gian – Spock

0

Đã xảy ra sự cố tương tự khi chạy vỏ zsh trên vùng chứa docker chạy với soạn thư, nó sẽ đóng với mã thoát 0 ngay sau khi bắt đầu.

@ bình luận của Spock bên dưới câu trả lời cuối cùng thực sự là chìa khóa, ít nhất là cho những gì tôi cần.

Đặt lệnh Docker-soạn của bạn cho hình ảnh là:

command: tail -f /dev/null 

Điều này sẽ giúp quá trình sống mà còn cho phép nó tắt máy một cách duyên dáng.

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