web-dev-qa-db-fra.com

Comment arrêter/relancer le conteneur Docker sans perdre les modifications?

J'ai procédé comme suit et perdu toutes les données modifiées dans mon conteneur Docker.

  1. docker build -t <name:tag> .
  2. docker run *-p 8080:80* --name <container_name> <name:tag>
  3. docker exec (importer et traiter certains fichiers, lancer un serveur pour les héberger)

Ensuite, j'ai voulu l'exécuter sur un autre port. docker stop & docker run ne fonctionne pas. Au lieu j'ai fait

  1. docker stop
  2. docker rm <container_name>
  3. docker run (mêmes paramètres qu'auparavant)

Après le redémarrage, j'ai constaté que les modifications survenues dans le conteneur à 1-3 avaient disparu et que je devais réexécuter l'importation.

Comment est-ce que je fais ceci correctement la prochaine fois?

6
culebrón

ce que vous devez faire, c'est créer l'image à partir du conteneur que vous venez d'arrêter après avoir apporté des modifications. Parce que votre ancienne commande utilise toujours l'ancienne image qui n'a pas de nouvelles modifications (vous avez apporté des modifications dans le conteneur que vous venez d'arrêter et non dans l'image)

docker commit --help

Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

docker commit -a me new_nginx myrepo/nginx:latest alors vous pouvez commencer le conteneur avec la nouvelle image que vous venez de construire

mais si vous ne voulez pas créer d'image avec les modifications que vous avez apportées (comme vous ne devez pas mettre la configuration contenant le mot de passe dans l'image), vous pouvez utiliser le montage en volume

docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py

Cette commande monte le répertoire de l'hôte,/src/webapp, dans le conteneur situé dans/webapp. Si le chemin/webapp existe déjà dans l’image du conteneur, le montage/src/webapp se superpose mais ne supprime pas le contenu préexistant. Une fois le montage supprimé, le contenu est à nouveau accessible. Ceci est cohérent avec le comportement attendu de la commande mount.

Gérer les données dans des conteneurs

4
Deepak

Chaque fois que vous faites un docker run, il créera un nouveau conteneur en fonction de votre image. Et une fois qu'un conteneur est démarré, il y a très peu de choses que docker vous permet de changer avec le docker update. Au lieu de cela, vous devez donc conserver vos données dans un volume externe devant persister entre les instances d'un conteneur. Par exemple.

docker run -p 8080:80 -v app-data:/data --name <container_name> <name:tag>

Le nom du volume (app-data) et le point de montage dans le conteneur (/ data) peuvent être modifiés pour vos propres besoins. Ensuite, lorsque vous détruisez et redémarrez un nouveau conteneur, vous pouvez monter le même volume dans le nouveau conteneur.

1
BMitch