Hallo, ik werk op een centos 7 server waarop php en apache geïnstalleerd zijn.
Ik wil dat wanneer iemand een button aanklikt er een Docker container opgestart wordt.

onder /var/www/html staat webscript.php
onder /var/www/cgi-bin staat docker_run.sh

webscript.php

<?php
if($_POST["submitted"])
{  
  exec ('/var/www/cgi-bin/docker_run.sh');
}
?>

<!DOCTYPE html>
<html>
<head>
	<title>?</title>
</head>
<body>
	<form method="post">
		<input type="hidden" name="submitted">
		<button type="submit">Run the script!</button>
	</form>
	<form action="exec(/var/www/cgi-bin/docker_run.sh)">
		<input type="submit" value="Open Script">
	</form>
</body>
</html>

docker_run.sh

#!/bin/bash

for i in {1..10}
 do docker run -name docker-nginx$i -P -d nginx
 sleep 3
done
Wat doet die exec(...) in je action-attribute van je form? Zo voer je geen PHP uit.

Die laatste form is gewoon zinloos.

<input type="hidden" name="submitted">

Dit veld heeft geen value, dus dit if-statement:
if($_POST["submitted"])

Evalueert waarschijnlijk tot de waarde false. Daarmee wordt de inhoud van het if-statement blok ook niet uitgevoerd.
Ok, zoals je kan zien ken ik er niet echt veel van ook al ben ik al dagen aan het lezen. Het laatste dat ik ooit gescript hebt, was nog in MS dos :)

Ik heb iets anders geprobeerd:

onder /var/www/html staat nu test.php
<?php
if ($_get['run']) {
exec("test.sh");
}
?>

<!.. This link will add ?run=true to your URL, test.php?run=true -->
<a href="?run=true">Click me!</a>

mijn test.sh:
#!/bin/bash
sudo docker run -it ubuntu


Ik kan nu inderdaad in de browser op click me, maar er gebeurt niets?
$_get['run']

Moet met hoofdletters.

$_GET['run']
En is je test.sh ook wel uitvoerbaar?
En kijk ook eens wat de uitvoer is van je shell-script:
<?php
exec("test.sh",$output);
echo "Uitvoer: ".print_r($output,true);
?>
Dat docker.sh script gaat niet werken want het script heeft het over een nginx terwijl je een apache2 geinstalleerd hebt.
Yoop Overmaat op 14/05/2019 12:50:10

Dat docker.sh script gaat niet werken want het script heeft het over een nginx terwijl je een apache2 geinstalleerd hebt.


Waarom zou dat niet werken? Het gaat hier over nginx runnen in een docker container, dan maakt dat toch niet uit dat er apache op de hostmachine staat?

[size=xsmall]Toevoeging op 14/05/2019 13:30:24:[/size]

Misschien dit eens proberen:

Indien je script niet runt zou ik vooral wel gaan kijken of PHP rechten heeft om dat shell script uit te voeren. In de variabele $output wordt nu de output opgevangen en geprint op het scherm zodoende je verder kan debuggen.

<?php
if ('POST' === $_SERVER['REQUEST_METHOD']) {  
  exec('/var/www/html/docker_run.sh', $output);
  var_dump($output);
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>?</title>
</head>
<body>
    <form method="post" action="">
        <button type="submit">Run the script!</button>
    </form>
</body>
Jelle Dnw op 14/05/2019 13:27:11
Indien je script niet runt zou ik vooral wel gaan kijken of PHP rechten heeft om dat shell script uit te voeren.

Dit kun je toch in afzondering testen en dat hoef je (in eerste instantie, om dingen te testen) niet te doen via een form submit? Dat pogingen om een form submit af te handelen falen vanwege gebrekkige kennis lijkt mij een apart probleem.

Separation of concerns mensen.

Daarnaast wil je ook terugkopppeling over wat (niet) werkt, dus maak je scripts verbose (mondig).
<?php
if (<een of andere conditie die je hebt verzonnen>) {
    echo 'werkt prima';
} else {
    echo 'no soup for you'; // <-- nu weet je dat je zut niet werkt
}
?>
Ok, ben nog aan het werk maar ga er straks mee aan de slag, bedankt voor alle reacties. Ik hou jullie op de hoogte.
Thomas van den Heuvel op 14/05/2019 17:34:11

Dit kun je toch in afzondering testen en dat hoef je (in eerste instantie, om dingen te testen) niet te doen via een form submit? Dat pogingen om een form submit af te handelen falen vanwege gebrekkige kennis lijkt mij een apart probleem.

Separation of concerns mensen.

Daarnaast wil je ook terugkopppeling over wat (niet) werkt, dus maak je scripts verbose (mondig).
<?php
if (<een of andere conditie die je hebt verzonnen>) {
    echo 'werkt prima';
} else {
    echo 'no soup for you'; // <-- nu weet je dat je zut niet werkt
}
?>



Je webserver user kan een andere user/group zijn dan wanneer je het script via SSH test, vandaar dat ik het even aanhaalde. Dan heeft je afgezonderde test een andere uitkomst dan je test via de webserver user.

Die else kan je aanwenden om het wat mooier weer te geven, ik verkoos een var_dump omdat je dan ziet wat de output van je exec is. Beetje programmeur kan er dan uit afleiden of het wel/niet werkt. Tenzij je die docker containers door iedereen wil laten op starten, maar dat denk ik nu niet.

Daarnaast gebruik ik trouwens bijna nooit else statements.
"Avoid else, return early." is een gouden regel in OO programming.

Reageren