comment obtenir docker-composer pour utiliser la dernière image du dépôt

Je ne sais pas ce que je fais de mal, mais je ne peux tout simplement pas obtenir docker-compose up d'utiliser la dernière image de notre registre sans d'abord enlever les vieux conteneurs du système complètement. Il semble que compose utilise l'image précédemment démarrée même si docker-compose pull a récupéré une nouvelle image.

j'ai regardé Comment obtenir docker-composer pour toujours recréer des conteneurs à partir d'images fraîches? qui semblait être similaire à mon problème, mais aucune des solutions fournies là-bas fonctionne pour moi, puisque je suis à la recherche d'une solution que je peux utiliser sur le serveur de production et là Je ne veux pas être enlever tous les conteneurs avant de les recommencer (perte de données possible?). Je voudrais pour composer seulement pour détecter la nouvelle version des images modifiées, les tirer et puis redémarrer les services avec ces nouvelles images.

j'ai créé un projet de test simple pour cela dans lequel le seul but est d'obtenir une version nr à augmenter à chaque nouvelle version. La version nr est affichée si je navigue vers le serveur nginx qui est créé (cela fonctionne comme prévu localement).

version docker: 1.11.2 docker-composer version: 1.7.1 OS: testé sur CentOS 7 et OS X 10.10 en utilisant docker-toolbox

mon docker-composer.yml:

version: '2'
services:
  application:
    image: ourprivate.docker.reg:5000/ourcompany/buildchaintest:0.1.8-dev
    volumes:
      - /var/www/html
    tty: true

  nginx:
    build: nginx
    ports:
      - "80:80"
    volumes_from:
      - application
    volumes:
      - ./logs/nginx/:/var/log/nginx
  php:
    container_name: buildchaintest_php_1
    build: php-fpm
    expose:
      - "9000"
    volumes_from:
      - application
    volumes:
      - ./logs/php-fpm/:/var/www/logs

sur notre serveur jenkins j'exécute ce qui suit pour construire et marquer l'image

cd $WORKSPACE && PROJECT_VERSION=$(cat VERSION)-dev
/usr/local/bin/docker-compose rm -f
/usr/local/bin/docker-compose build
docker tag ourprivate.docker.reg:5000/ourcompany/buildchaintest ourprivate.docker.reg:5000/ourcompany/buildchaintest:$PROJECT_VERSION
docker push ourprivate.docker.reg:5000/ourcompany/buildchaintest

ce semble faire ce qu'il est censé être depuis que je reçois une nouvelle étiquette de version dans notre dépôt à chaque fois que la construction complète et la version nr a été déplacée.

Si j'ai

docker-compose pull && docker-compose -f docker-compose.yml up -d

dans un dossier sur mon ordinateur, où le contenu n'est que le docker-composer.yml et les fichiers Dockerfiles nécessaires pour construire les services Nginx et php, la sortie que j'obtiens n'est pas le dernier numéro de version Tel qu'il a été étiqueté dans le registre ou est affiché dans le docker-composer.yml (0.1.8), mais la version précédente, qui est 0.1.7. Cependant, la sortie de la commande pull suggère qu'une nouvelle version de l'image a été extraite:

Pulling application (ourprivate.docker.reg:5000/ourcompany/buildchaintest:latest)...
latest: Pulling from ourcompany/buildchaintest
Digest: sha256:8f7a06203005ff932799fe89e7756cd21719cccb9099b7898af2399414bfe62a
Status: Downloaded newer image for docker.locotech.fi:5000/locotech/buildchaintest:0.1.8-dev

Seulement si je lance

docker-compose stop && docker-compose rm -f

et ensuite, lancez la commande docker-compose up si je vois la nouvelle version apparaître à l'écran comme prévu.

est-ce le comportement prévu de docker-composer? i.e. dois-je toujours faire un docker-compose rm -f avant lancer up encore, même sur les serveurs de production? Ou est-ce que je fais quelque chose contre le grain ici, qui est pourquoi il ne fonctionne pas?

le but est d'avoir notre construction de processus de construction et de créer des versions étiquetées des images nécessaires dans un docker-composer.YML, poussez ceux-ci à notre registre privé et ensuite pour la "release to production-step" de simplement copier le docker-composer.yml vers le serveur de production et lancer un docker-compose pull && docker-compose -f docker-compose.yml up -d pour que la nouvelle image démarre en production. Si n'importe qui a des conseils sur ceci ou peut pointer vers un tutoriel de meilleures pratiques pour ce genre de configuration qui serait très apprécié aussi.

22
demandé sur Community 2016-06-07 20:24:19

7 réponses

pour clore cette question, ce qui semble avoir fonctionné est effectivement en cours d'exécution

docker-compose stop
docker-compose rm -f
docker-compose -f docker-compose.yml up -d

i. e. retirez les récipients avant d'exécuter à nouveau up .

ce que l'on doit garder à l'esprit quand on le fait comme ça, c'est que les conteneurs de volume de données sont retirés aussi bien si vous venez d'exécuter rm -f . Afin d'empêcher que je spécifie explicitement chaque conteneur à supprimer:

docker-compose rm -f application nginx php

comme je l'ai dit dans ma question, je ne sais pas si c'est le bon processus. Mais cela semble fonctionner pour notre cas d'utilisation, jusqu'à ce que nous trouver une meilleure solution que nous allons rouler avec celui-ci.

11
répondu Jens Wegar 2016-06-30 07:31:59

afin de vous assurer que vous utilisez la dernière version de votre étiquette :latest de votre registre (par exemple Docker hub), vous devez également tirer la dernière étiquette à nouveau. dans le cas où il a changé, la diff sera téléchargé et a commencé lorsque vous docker-compose up à nouveau.

alors ce serait la voie à suivre:

docker-compose stop
docker-compose rm -f
docker-compose pull   
docker-compose up -d

j'ai collé ceci dans une image que j'exécute pour démarrer docker-composer et s'assurer que les images restent à jour: https://hub.docker.com/r/stephanlindauer/docker-compose-updater /

10
répondu stephanlindauer 2017-07-14 15:18:41

pour obtenir les dernières images utilisez docker-composer build -- pull

j'utilise ci-dessous la commande qui est vraiment 3 en 1

 "docker-compose down && docker-compose build --pull && docker-compose up -d"

cette commande va arrêter les services, tirer la dernière image et puis démarrer les services.

8
répondu Abhishek Galoda 2017-09-01 09:05:35

j'ai vu cela se produire dans notre système de production 7-8 docker. Une autre solution qui a fonctionné pour moi dans la production était d'exécuter

docker-compose down
docker-compose up -d

cela supprime les conteneurs et semble créer de nouveaux à partir de la dernière image.

cela ne résout pas encore mon rêve de down+up pour chaque conteneur changé (en série, moins de temps d'arrêt), mais cela fonctionne pour forcer 'up' à mettre à jour les conteneurs.

1
répondu Danku 2016-08-30 08:42:20

la documentation docker-composer pour la commande 'up' indique clairement qu'elle met à jour le conteneur Si l'image est changée depuis la dernière' up 'effectuée:

S'il existe des conteneurs existants pour un service, et que la configuration ou l'image du service a été modifiée après la création du conteneur, docker-composer reprend les changements en arrêtant et en recréant les conteneurs (en préservant les volumes montés).

ainsi, en utilisant "stop" suivi de "pull" puis " up " cela devrait éviter les problèmes de volumes perdus pour les conteneurs en cours d'exécution, sauf bien sûr, pour les conteneurs dont les images ont été mises à jour.

je suis en train d'expérimenter ce processus et j'inclurai mes résultats dans ce commentaire sous peu.

0
répondu Paul Pritchard 2017-08-31 15:14:22

j'ai étendu le script D'Abhi un peu plus loin comme ci-dessous

export composeFile="docker-compose.test.yml"
docker-compose -f  $composeFile down 
docker-compose -f  $composeFile pull 
docker-compose -f  $composeFile up -d
0
répondu scorpio 2018-06-21 15:16:08

Option down résoudre ce problème

j'exécute mon fichier de composition:

docker-compose -f docker/docker-compose.yml up -d

puis je supprime tout avec down --rmi all

docker-compose -f docker/docker-compose.yml down --rmi all

Stops containers and removes containers, networks, volumes, and images
created by `up`.

By default, the only things removed are:

- Containers for services defined in the Compose file
- Networks defined in the `networks` section of the Compose file
- The default network, if one is used

Networks and volumes defined as `external` are never removed.

Usage: down [options]

Options:
    --rmi type          Remove images. Type must be one of:
                        'all': Remove all images used by any service.
                        'local': Remove only images that don't have a custom tag
                        set by the `image` field.
    -v, --volumes       Remove named volumes declared in the `volumes` section
                        of the Compose file and anonymous volumes
                        attached to containers.
    --remove-orphans    Remove containers for services not defined in the
                        Compose file
0
répondu Slavik Muz 2018-06-26 12:38:43