web-dev-qa-db-ja.com

docker-composeを使用してコンテナを存続させ、リンクします

docker-composeを使用して、phpといくつかのデータベース(orientdb、neo4jなど)を一緒に作成したいと思います。次に、phpコンテナに入り、シェルを使用してコマンドを実行します。

個々に、私のコンテナはすべて水泳で動作し、一緒に構成すると、すべて実行されます。ただし、テストのためにコンテナに入ることができるように、phpコンテナを存続させる方法を一生理解することはできません。

簡単にするために、orient-dbという単一のデータベースを使用します。

私のdocker-compose.ymlファイル:

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

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

私の "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

私は(とりわけ)試しました:

  • ある端末ではdocker-compose up、次に別の端末ではdocker attach
  • 作成ファイルでttystdin_openを有効にする
  • /bin/bashコマンドを使用する
  • CMD exec vendor/bin/phpunit -D FOREGROUNDのバリエーション

そして、私が試したいくつかの参考資料:- サービスの開始後にDockerコンテナを実行し続ける方法は? - https://github.com/docker/compose/issues/1926 - https://github.com/docker/compose/issues/42

どんな助けでも本当にありがたいです。

ありがとうございました。

10
Apollo

したがって、docker-composeは、docker-engineクライアントの単なる代用です。クライアントとの機能の同等性を維持します。このような問題を診断するには、通常のoleクライアントで機能するようになるまでdocker-composeの使用を中止する必要があります。ここでのコメントと他の回答に基づくと、フォアグラウンドでデーモンプロセスを使用してコンテナを実行していないように思われます。 Dockerでインタラクティブシェルを実行する場合は、-itフラグを使用する必要があります(-tはttyを割り当て、-iはインタラクティブセッションを開始します)。これらのスイッチでDockerを実行しないと、インタラクティブなシェルを起動してもコンテナは存続しません。 php -a

Dockerは、仮想マシンではなく、プロセスを実行するための優れた方法と考えると役立ちます。実行しているプロセス(およびその子)の存続期間外に存在するのは、「環境」ではありません。通常、PHPはサーバー(Apache、Nginxなど)によって呼び出されます。ここで意味するのは、実行するにはPHPプロセスが必要であるということです。コンテナにドロップしていくつかのことをテストできるように、「永続的に」。インタラクティブシェルを除いて、それは不可能であり、インタラクティブシェルプロセスを存続させるには、特に-itスイッチを使用する必要があります。ここでの本当の答えは、関連するデーモン/サーバープロセスがフォアグラウンドでリッスンしない限り、ここで実行しようとしていることを実行できないことです(PHPコンテナーを実行し続ける)。その理由は、それがPHPのしくみではないからです。もしあなたが本当にあなたのPHP imageからコンテナに入りたいのなら、その上にシェルにドロップするだけです:

docker run -it apollo/php /bin/bash

...そして、PHPイメージからコンテナーを開始し、コンテナーにシェルを取得します(シェルを終了するとすぐに停止します)。しかし、繰り返しになりますが、私の最初の段落、docker-composeはここに行く方法ではありません。

10
L0j1k

Composeで実行されているdockerコンテナでzshShellを実行する場合にも同様の問題があり、開始直後に終了コード0で終了していました。

最後の答えの下にある@Spockのコメントは、少なくとも私が必要としているものにとって、実際には重要です。

画像のdocker-composeコマンドを次のように設定します。

command: tail -f /dev/null

これにより、プロセスが存続しますが、正常にシャットダウンすることもできます。

5
SeedyROM

docker-compose upで実行し、端末にエラーが出力されない場合は、サービスが終了したためにサービスが停止していることを示しています(エラーが発生するのではありません)。

エラーの潜在的な原因の1つは、PHP(composerのインストール)にデータを送信していることです。これにより、php:5.6-cliイメージによって起動されるインタラクティブphpターミナルが強制終了されます。インタラクティブphpを開始するにはシェルは、Dockerfileの最後に次を再度追加します。

CMD ["php", "-a"]

docker-compose upで再試行してください

補足:すべてが正常に実行されている場合は、docker-compose up -dを実行してデーモンモードで実行し、ターミナルを再度制御できます(すべてのstdout + stderrはdockerコンテナーのそれぞれのログファイルに記録されます) )。

その後、コンテナに接続して作業を行うことができます。 docker exec -it <containerID> bashdocker attach <container id>よりも速いことがいつもわかりました

お役に立てれば。

5
tgallacher

プロセスが終了しないようにエントリポイントに参加します

version: "3.7"
services:
    debug-srv:
        container_name: "debug-srv"
        image: "Alpine:latest"
        entrypoint: ["tail", "-f", "/dev/null"]
        networks:
            debug-net:
networks:
    debug-net:
        name: "debug-net"
2
Rod Terry