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
tty
とstdin_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
どんな助けでも本当にありがたいです。
ありがとうございました。
したがって、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はここに行く方法ではありません。
Composeで実行されているdockerコンテナでzshShellを実行する場合にも同様の問題があり、開始直後に終了コード0で終了していました。
最後の答えの下にある@Spockのコメントは、少なくとも私が必要としているものにとって、実際には重要です。
画像のdocker-composeコマンドを次のように設定します。
command: tail -f /dev/null
これにより、プロセスが存続しますが、正常にシャットダウンすることもできます。
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> bash
はdocker attach <container id>
よりも速いことがいつもわかりました
お役に立てれば。
プロセスが終了しないようにエントリポイントに参加します
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"