95 votes

comment obtenir docker-composer à l'utilisation de la dernière image à partir du référentiel

Je ne sais pas ce que je fais mal, mais je ne peut tout simplement pas obtenir de l' docker-compose up à utiliser la dernière image de notre registre sans enlever le vieux conteneurs du système complètement. Il ressemble à composer est à l'aide de la déjà commencé à l'image, même si docker-composer pull a récupéré une nouvelle image.

J'ai regardé Comment obtenir docker-composer de toujours re-créer des conteneurs de nouvelles images? ce qui semblait être similaire à mon problème, mais aucune des solutions de travail pour moi, depuis que je suis à la recherche d'une solution que je peux utiliser sur le serveur de production et de là, je ne veux pas être la suppression de tous les contenants avant de les commencer à nouveau (perte de données possible?). Je voudrais pour composer seulement de détecter la nouvelle version de la modification des images, tirez-la, puis redémarrez les services avec ces nouvelles images.

J'ai créé un test simple de ce projet dont le seul but est d'obtenir une version nr augmenter chaque nouvelle version. La version nr est affiché si je parcourir pour le serveur nginx qui est créé (cela fonctionne comme prévu localement).

docker version: 1.11.2 docker-composer version: 1.7.1 OS: testé sur les deux CentOS 7 et OS X 10.10 à l'aide de docker-boîte à outils

Mon menu fixe-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-je exécuter les opérations suivantes pour construire et balise de 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

cela semble être ce qu'il est censé être depuis, je reçois une nouvelle version de la balise dans notre référentiel à chaque fois la création terminée et la version nr a été heurté.

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 de la nécessaire Dockerfiles pour construire la nginx et php de services, le résultat que j'obtiens est pas le dernier numéro de version a été identifié dans le registre ou est affiché dans le menu fixe-composer.yml (0.1.8), mais la version d'avant, 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 puis exécutez l' docker-compose up commande dois-je obtenir la nouvelle version de montrer à l'écran, comme prévu.

Est-ce destiné comportement de docker-composer? c'est à dire dois-je toujours un docker-compose rm -f avant l'exécution d' up , même sur les serveurs de production? Ou suis-je en train de faire quelque chose contre le grain ici, c'est pourquoi il ne fonctionne pas?

L'objectif est de notre processus de fabrication de construire et de créer des versions marqués de les images nécessaires dans un docker-composer.yml, pousser à ceux de nos privée de registre et puis pour la "mise en production-étape" pour copier simplement le docker-composer.yml pour le serveur de production et d'exécuter un docker-compose pull && docker-compose -f docker-compose.yml up -d pour la nouvelle image pour démarrer la production. Si quelqu'un a des conseils à ce sujet ou peut pointer vers une meilleures pratiques tutoriel pour ce genre de configuration qui serait très apprécié également.

76voto

stephanlindauer Points 30

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

donc, ce serait la voie à suivre:

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

j'ai collé cette image que j'ai exécuter pour lancer le menu fixe-composer et assurez-vous que les images de rester up-to-date: https://hub.docker.com/r/stephanlindauer/docker-compose-updater/

37voto

Abhishek Galoda Points 589

Pour obtenir les dernières images d'utiliser docker-composition de construire --tirer

J'ai utiliser la commande ci-dessous qui est vraiment 3 en 1

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

Cette Commande permet d'arrêter les services, tirer la dernière image et de redémarrer les services.

23voto

Jens Wegar Points 907

Pour clore cette question, ce qui semblait avoir travaillé est en effet en cours d'exécution

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

I. e. supprimer les conteneurs avant l'exécution d' up de nouveau.

Ce que l'on doit garder à l'esprit lorsque vous faites comme ceci, c'est que le volume de données conteneurs sont supprimés ainsi si vous venez d'exécuter rm -f. Afin d'éviter que je spécifie explicitement chaque récipient à 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.

3voto

Danku Points 94

J'ai vu cela se produire dans notre 7-8 docker système de production. Une autre solution qui a fonctionné pour moi dans la production a été de courir

docker-compose down
docker-compose up -d

cela supprime les conteneurs et semble faire des " up " en créer de nouveaux à partir de la dernière image.

Ce n'est pas encore résoudre mon rêve d'en bas+haut par CHAQUE changé conteneur (alternativement, en moins de temps), mais il fonctionne à la force " up " pour mettre à jour les conteneurs.

0voto

Paul Pritchard Points 86

Le docker-composition de la documentation pour le "up" de commande indique clairement qu'il met à jour le conteneur si l'image devait être changé depuis la dernière " up " a été réalisée:

S'il existe déjà des conteneurs pour un service, et la configuration du service ou de l'image a été modifié après que le conteneur de la création, docker-composer jusqu' ramasse les changements en arrêtant et en recréant les conteneurs (en conservant les volumes montés).

Ainsi, en utilisant le 'stop', suivi de 'pull' puis 'jusqu'à' ce devrait donc éviter les problèmes de perte de volumes pour l'exécution des conteneurs, à l'exception, bien sûr, pour les conteneurs, dont les images ont été mises à jour.

Je suis actuellement à l'essai avec ce processus et comprendra mes résultats à ce commentaire peu de temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X