0
votes

Docker Conteneur exécute et arrête immédiatement

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.

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.

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).

Ceci est ma tentative actuelle. xxx

J'ai également essayé avec xxx

et xxx

au moment où le script Bash ne consiste à créer un fichier HTML. xxx


4 commentaires

Est-ce qu'il arrête ou commence-t-il à courir? DO Docker PS Pour voir les informations sur les conteneurs à exécution et Docker PS -A Pour voir tous vos conteneurs. À l'aide de cela, vous n'avez pas de point d'entrée Bash , 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 , exécutez à: Exécuter chmod + x /usr/bin/start_container.sh et remplacer l'entréePoint par cmd comme: cmd bash /usr/bin/start_container.sh


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.


3 Réponses :


0
votes

si par "exécute" Vous voulez dire une invite bash , vous pouvez procéder comme suit: xxx

Ceci vous demandera que les conteneurs bash < / code>. Pour vérifier si le conteneur a été construit, vous pouvez faire docker ps -a .


6 commentaires

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 A .sh fichier? Vous n'avez pas semblé spécifier ce qui est / était. Si tel est le cas, votre problème est effectivement EntryPoint et comment vous appelez le fichier start_container.sh .


@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 Copies par rapport aux répertoires / fichiers, et vous ne pouvez pas se mêler à la fois. Soit vous faites ajoutez dir / machine / ou que vous faites Ajouter la machine Dir / File.sh Machine / File.sh . Exécuter est bon, mais il manquait le .sh extension: exécuter chmod + x /usr/bin/start_container.sh . Le fichier est faux, car vous devez appeler avec l'outil approprié: entréePoint ["bin / bash /", "start_container.sh"]



1
votes

Vous n'avez pas besoin de remplacer le 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. XXX PRE>

Dans ce cas ci-dessus, le conteneur s'éteindra une fois qu'il crée le index.html code>. p>

Solution de contournement sur votre cas p> xxx pré>

dockerfile p> xxx pré>

Ensuite P>

FROM php:7.2-apache
RUN echo "hello world" > /var/www/html/index.html
EXPOSE 80


2 commentaires

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é car le processus est déjà en cours d'exécution. C'est pourquoi il montrant le port est déjà occupé.



0
votes

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"


0 commentaires