2017-06-13 15 views
1

まあ、PHP関数を使ってDockerを実行する必要があります。私はshell_execまたはexecを使ってシェルの命令を実行するリンクを押すWebページを持っています。実行がlsなどの結果を期待するようなものであれば、これは私のために働きます。問題は、コマンドがDocker(またはpingなど)を実行することである場合、動作しないということです。PHPを使ってシェル内のドッカーを実行する

私が望むのは、ユーザーがリンクをクリックすると、シェルがブラウザでDockerを実行するコマンドを実行し、ページがリダイレクトされることです。

たとえば、shell_exec('firefox');を使用すると、新しいFirefoxブラウザが開かれるはずですが、動作しません。ブラウザは開かれているようですが、数秒後に閉じられます。

これは動作しないDockerの実行です。

public function executeDocker() { 
     $result = shell_exec('docker run --rm -p 3838:3838 shiny/gsva_interactive /usr/bin/shiny-server.sh'); 

     echo "<br><br>Execution: ".$result; 
    } 
+0

最後に、 '' docker run --rm -p 3838:3838 shiny/gsva_interactive /usr/bin/shiny-server.shのようにいくつか追加してください。 tail/var/log/xxx '? – user2915097

+0

このコマンドは正常に動作しますが、動作しないPHP関数です。 – JFernandez

答えて

0

最後に私はそれを解決しました。問題はユーザーグループとアクセス許可にありました。私が使っていたシステムでは、CentOS、Apacheサーバはapacheというユーザを使います。このユーザーはdockerグループに属していて、サービスを再起動する必要があります。

これで機能します。私を助けてくれた皆様に感謝します。

1

shell_execのみの出力を返しますが、この場合ドッカーには、コマンドが完全に終了したときにのみコマンド。 pingの場合(それはちょうどpingを続けます)、おそらくあなたのDockerイメージの場合、プロセスは決して終了しないので、決して応答を出すことはありません。

shell_execの代わりにpassthruを使用すると、Dockerスクリプトのコマンドライン出力が返されます。

Dockerコンテナが終了しない場合は、detached mode$containerId = shell_exec('docker run -d --rm -p 3838:3838 shiny/gsva_interactive /usr/bin/shiny-server.sh')で開始する必要がありますので、dockerの実行コマンドは終了します。これによりコンテナIDが返されます。コンテナIDは$result = shell_exec("docker ps -f \"id=$containerId\"")と一緒に使用して、コンテナが正しく実行されているかどうかを確認し、コンテナが正しくリダイレ​​クトされているかどうかを確認します。

+0

私は出力を望んでいない、私はちょうどドッカーが正しく実行されていることを知る必要があり、実行を制御する方法を見つける。 – JFernandez

+0

Dockerコンテナが終了したことを確認できますか?私の答えのポイントは、Dockerコンテナが終了しない場合、shell_execは決してあなたに*任意の*出力を与えないということです。 Pingもデフォルト設定で終了しないので、 'ls'が動作し、' ping'が動作しないのはこのためです。 – eawenden

+0

Dockerコンテナを終了したくないという前提に基づいて質問を更新しました。 – eawenden

関連する問題