118 votes

Docker Compose ne permet pas d'utiliser des images locales

La commande suivante échoue lorsqu'elle tente de tirer une image du Docker Hub :

$ docker-compose up -d
Pulling web-server (web-server:staging)...
ERROR: repository web-server not found: does not exist or no pull access

Mais je veux juste utiliser une version locale de l'image, qui existe :

$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
web-server           staging             b94573990687        7 hours ago         365MB

Pourquoi Docker ne fait pas de recherche parmi les images stockées localement ?


Voici mon fichier Docker Compose :

version: '3'
services:
  chat-server:
    image: chat-server:staging
    ports:
      - "8110:8110"
  web-server:
    image: web-server:staging
    ports:
      - "80:80"
      - "443:443"
      - "8009:8009"
      - "8443:8443"

et mon fichier .env :

DOCKER_HOST=tcp://***.***.**.**:2376
DOCKER_TLS_VERIFY=true 
DOCKER_CERT_PATH=/Users/Victor/Documents/Development/projects/.../target/docker

3 votes

Pouvez-vous vérifier que l'image du serveur web a été construite localement ? Veuillez inclure l'image du serveur web. docker-compose.yml fichier

0 votes

Peut-être que l'une d'entre elles fonctionnera : redémarrer le service Docker, recréer l'image du serveur Web avec Docker Build, puis essayer d'exécuter Docker Compose.

0 votes

@DenisTsoi J'ai ajouté mon fichier docker-compose. Comment dois-je vérifier que l'image a été construite localement ? J'ai fourni la sortie de docker images qui liste mon image. Je suppose que cela vérifie que l'image a bien été construite ici.

99voto

n2o Points 441

En général, cela devrait fonctionner comme vous le décrivez. J'ai essayé de le reproduire, mais cela a simplement fonctionné...

Structure du dossier :

.
 docker-compose.yml
 Dockerfile

Contenu du Dockerfile :

FROM alpine
CMD ["echo", "i am groot"]

Construire et baliser l'image :

docker build -t groot .
docker tag groot:latest groot:staging

avec docker-compose.yml :

version: '3.1'
services:
  groot:
    image: groot:staging

et lancez docker-compose :

$ docker-compose up
Creating groot_groot ... 
Creating groot_groot_1 ... done
Attaching to groot_groot_1
groot_1  | i am groot
groot_groot_1 exited with code 0

0 votes

Cette solution fonctionne sur mon gocd ci, où j'efface tous les conteneurs et l'image avant chaque exécution, mais ne fonctionne pas sur ma machine de développement....

0 votes

Vous pouvez avoir besoin d'utiliser cette commande pour construire l'image et forcer un nouveau conteneur : docker-compose up --build --force-recreate

26voto

Ben Winding Points 475

Version >1.23 (2019 et plus récent)

Le moyen le plus simple est de changer image a build: et faire référence à la Dockerfile dans le répertoire relatif, comme indiqué ci-dessous :

version: '3.0'
services:
  custom_1:
    build:
      context: ./my_dir
      dockerfile: Dockerfile

Cela permet docker-compose pour gérer l'ensemble de l'orchestration de la construction et de l'image en une seule commande.

# Rebuild all images
docker-compose build
# Run system
docker-compose up

23voto

Denis Tsoi Points 1878

Dans votre docker-compose.yml, vous pouvez spécifier build: . au lieu de build: <username>/repo> pour les constructions locales (plutôt que de tirer de docker-hub) - je ne peux pas encore le vérifier, mais je crois que vous puede être capable de faire des chemins relatifs pour plusieurs services au fichier docker-compose.

services:
  app:
    build: .

Référence : https://github.com/gvilarino/docker-workshop

3 votes

Je sais qu'il est possible de construire une image localement mais je pense que ce n'est pas une bonne idée. A mon avis, il est préférable de séparer les étapes de construction et d'exécution comme indiqué ici : 12factor.net/build-release-run

2 votes

C'est un bon point, et je suis d'accord - cela ne devrait pas être utilisé dans n'importe quelle circonstance normale, cependant, je crois que c'est une étape rapide par rapport à la construction locale puis à la poussée vers docker hub (surtout si vous voulez vérifier si les services communiquent entre eux).

14 votes

Je viens du futur, et j'ai vérifié que build: ./app ... build: ./other-app travaux

16voto

Minjeong Choi Points 169

Mars-09-2020 EDIT :

(docker version 18.09.9-ce build 039a7df, dockercompose version 1.24.0, build 0aa59064)

J'ai découvert que pour créer un conteneur docker, il suffit de docker-compose 'up -d' après avoir marqué le conteneur avec une fausse étiquette de serveur de registre local (localhost:5000/{image}).

$ docker tag {imagename}:{imagetag} localhost:5000/{imagename}:{imagetag}

Vous n'avez pas besoin d'exécuter le serveur de registre local, mais vous devez changer l'url de l'image dans le fichier yaml de dockercompose avec l'url du faux serveur de registre local :

version: '3'
services:
web-server:
  image: localhost:5000/{your-image-name} #change from {imagename}:{imagetag} to localhost:5000/{imagename}:{imagetag}
  ports:
    - "80:80"

de {imagename}:{imagetag} à localhost:5000/{imagename}:{imagetag}

et juste en haut -d

$ docker-compose -f {yamlfile}.yaml up -d 

Cela crée le conteneur si vous avez déjà l'image (localhost:5000/{imagename}) dans votre machine locale.


Complétant la réponse de @Tom Saleeba,

J'ai toujours des erreurs après avoir marqué le conteneur avec "/". (par ex : victor-dombrovsky/docker-image:latest ) Il continue à chercher l'image du serveur distant docker.io.

registry_address/docker-image

Il semble que l'url avant "/" soit l'adresse du registre et après "/" le nom de l'image. Sans "/", docker-compose recherche par défaut l'image sur le site distant docker.io.

Je suppose que c'est un bug connu avec docker-compose

J'ai finalement réussi à le faire fonctionner en exécuter le registre local , en poussant l'image vers le registre local avec la balise du registre, et en retirant l'image du registre local.

$ docker run -d -p 5000:5000 --restart=always --name registry registry:2
$ docker tag your-image-name:latest localhost:5000/your-image-name
$ docker push localhost:5000/your-image-name

et ensuite changer l'url de l'image dans le dockerfile :

version: '3'
services:
  chat-server:
    image: chat-server:staging
    ports:
      - "8110:8110"
  web-server:
    image: localhost:5000/{your-image-name} #####change here
    ports:
      - "80:80"
      - "443:443"
      - "8009:8009"
      - "8443:8443"

De même pour l'image du serveur de chat.

8voto

Tom Saleeba Points 571

Vous devrez peut-être modifier votre balise d'image pour qu'elle comporte deux parties séparées par une barre oblique. / . Ainsi, au lieu de

chat-server:staging

faire quelque chose comme :

victor-dombrovsky/chat-server:staging

Je pense qu'il y a une certaine logique derrière les balises Docker et que les balises "one part" sont interprétées comme des images officielles provenant de DockerHub.

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