J'ai essayé de faire un dockerfile qui crée un serveur Web pouvant serveur pages HTML et PHP.
Je demande que les images soient construites qui, lorsqu'elles fonctionnent, il exécute un script shell au démarrage une fois. p>
J'ai essayé de le faire avec l'entréePoint, mais ce que je trouve, c'est que le conteneur fonctionne, mais il sort immédiatement. P>
J'exige que cela soit codé dans le dockerfile comme l'image Est exécuté directement à partir de GCP sur un VM à l'aide du système d'exploitation optimisé par le conteneur où il exécute l'image Docker au démarrage du VM (donc je n'ai donc pas la possibilité d'utiliser Docker Run -C). p>
Ceci est ma tentative actuelle. p> J'ai également essayé avec p> et p> au moment où le script Bash ne consiste à créer un fichier HTML. p>
3 Réponses :
si par "exécute" Vous voulez dire une invite Ceci vous demandera que les conteneurs bash code>, vous pouvez procéder comme suit:
bash < / code>. Pour vérifier si le conteneur a été construit, vous pouvez faire
docker ps -a code>. p> p>
Je pense qu'il veut dire que lorsqu'il exécute en fait l'image, cela ne reste pas en place comme un conteneur. Et je suppose que c'est à cause de "entréePoint"
Non, j'en ai besoin pour exécuter le script bash start_container.sh Lorsque le conteneur est exécuté, au moment où je fais du docker exécuté -d -p 8080: 80 --Name myApp aa0d524b8c06, puis docker ps ne l'utilise pas. est montré sous Docker PS -A afin qu'il ait fonctionné et sorti immédiatement
Est start_container code> A
.sh code> fichier? Vous n'avez pas semblé spécifier ce qui est / était. Si tel est le cas, votre problème est effectivement
EntryPoint code> et comment vous appelez le fichier
start_container.sh code>.
@daudnadem Merci pour la clarification - a le sens complet.
Donc, j'ai beaucoup peut-être malgré cela, mais si j'utilise ajoutez start_container.sh / usr / bin / start_container mettrait le script .sh dans un dossier appelé start_container, l'exécution chmod est des autorisations d'exécuter chmod + x / usr / bin / start_container alors le EntryPoint exécute le contenu du dossier donné lorsque l'image est exécutée. Entrypoint ["start_container"]
Donc, ajoutez code> Copies par rapport aux répertoires / fichiers, et vous ne pouvez pas se mêler à la fois. Soit vous faites
ajoutez dir / machine / code> ou que vous faites
Ajouter la machine Dir / File.sh Machine / File.sh Code>.
Exécuter CODE> est bon, mais il manquait le
.sh code> extension:
exécuter chmod + x /usr/bin/start_container.sh code>. Le fichier
code> est faux, car vous devez appeler avec l'outil approprié:
entréePoint ["bin / bash /", "start_container.sh"] code>
Vous n'avez pas besoin de remplacer le Dans ce cas ci-dessus, le conteneur s'éteindra une fois qu'il crée le Solution de contournement sur votre cas p> dockerfile p> Ensuite P> cmd code> ou
d'entrée code> comme Image de base Démarrez AppAche à partir du
cmd code>, c'est pourquoi votre conteneur meurt dès qu'il exécute votre script Bash qui crée simplement index.html. La durée de vie du conteneur est la durée de vie de l'entréePoint afin d'exécuter un processus de longue date qui les conserve en cours d'exécution.
index.html code>. p>
FROM php:7.2-apache
RUN echo "hello world" > /var/www/html/index.html
EXPOSE 80
D'accord, cela me fait très près de travailler parfaitement pour moi. Donc, malheureusement, lorsque j'exécute mon script puis exécutez Apache2 au premier plan, je reçois une erreur dans les journaux indiquant (98) Adresse déjà utilisée: AH00072: make_sock: impossible de lier à l'adresse [::]: 80 (98) UTILISATION: AH00072: Make_Sock: Impossible de se lier à l'adresse 0.0.0.0:80 Pas de prises d'écoute disponibles, arrêt de l'arrêt AH00015: impossible d'ouvrir les journaux SAVous connaissez ce qui pourrait causer cela?
Vous ne devriez plus exécuter dans docker exécuté code> car le processus est déjà en cours d'exécution. C'est pourquoi il montrant le port est déjà occupé.
Le problème que je suis confronté était parce que le serveur Web Apache démarrerait à partir du script, j'exécuterais une commande dans le script qui complète ensuite le conteneur éteint.
La solution consistait à écrire une erreur d'erreur dans le script et Gardez le service Apache exécuté en ajoutant une attente sur le service qui maintient le service en vie pour toujours: attendez «$ start_ws_pid» Ceci empêche le dernier service PID de service. P>
# SIGTERM-handler term_handler() { exit 143; # 128 + 15 -- SIGTERM } # setup handlers trap 'term_handler' SIGTERM function exportBoolean { if [ "${!1}" = "**Boolean**" ]; then export ${1}='' else export ${1}='Yes.' fi } # Start Job Server if [ $LOG_LEVEL == 'debug' ]; then /usr/sbin/apachectl -DFOREGROUND -k start -e debug & START_WS_PID="$!" else &>/dev/null /usr/sbin/apachectl -DFOREGROUND -k start & START_WS_PID="$!" echo $! fi echo $START_WS_PID **Do something on the command line** wait "$START_WS_PID"
Est-ce qu'il arrête ou commence-t-il à courir? DO
Docker PS CODE> Pour voir les informations sur les conteneurs à exécution et
Docker PS -A CODE> Pour voir tous vos conteneurs. À l'aide de cela, vous n'avez pas de point d'entrée code> Bash code>, de sorte que le conteneur ne fonctionne pas dans votre terminal comme je m'attends à ce que vous vous attendiez.
Il me semble que votre dockerfile n'a pas de but. Que se passe-t-il si vous modifiez la ligne d'addition à:
Ajouter start_container.sh /usr/bin/start_container.sh code>, exécutez à:
Exécuter chmod + x /usr/bin/start_container.sh code> et remplacer l'entréePoint par cmd comme:
cmd bash /usr/bin/start_container.sh code>
De plus, comment exécutez-vous l'image Docker?
@daudnaDeem J'ai apporté les modifications, mais elle renvoie toujours un statut de (0) il y a 10 secondes. L'image est exécutée sur GCP dans un système d'exploitation optmisé conteneur qui prend l'image et l'exécute au démarrage du serveur.