web-dev-qa-db-fra.com

Docker swarm: configuration de «construction» dans le fichier de composition de docker ignorée lors du déploiement de la pile

Nous avons créé un fichier de composition docker avec plusieurs services. Les images de ces services sont construites lors de l'exécution à l'aide de l'option de configuration "build". Les fichiers Dockerfile correspondants sont indiqués dans les répertoires respectifs.

Exemple de fichier de composition Docker ...

version: '3'
services:
  db2server:
    build: ./db2server
    ports:
      - "50005:50000"
    command: ["db2start"]
  appruntime:
    build: ./appruntime
    depends_on:
     - db2server

Ce fichier Docker compose fonctionne avec docker-compose commande.

  • Les images sont construites en runtime à partir des fichiers Dockerfile présents dans db2server & appruntime répertoires
  • Ces images sont déployées sur la machine hôte

Mais lorsque nous essayons de déployer cela dans un essaim de dockers, l'erreur suivante est levée ...

docker stack deploy -c /home/docker/docker-compose.yml app

Ignoring unsupported options: build

Creating network app_default
Creating service app_db2server
failed to create service app_db2server: Error response from daemon: rpc error: code = InvalidArgument desc = ContainerSpec: image reference must be provided

Il semble que l'option de configuration "build" soit ignorée lors du déploiement de la pile dans l'essaim de dockers.

Comment pouvons-nous déployer ces services (avec l'option de construction) définis dans le fichier Docker compose dans un essaim de dockers.

14
dinup24

En bref, vous ne pouvez pas utiliser la commande build avec docker stack deploy.

De la docs :

Remarque : L'option docker stackbuild de la commande est ignorée lors du déploiement d'une pile en mode essaim avec un (version 3) Composez le fichier. La commande docker stack Accepte uniquement les images prédéfinies.

Une alternative consiste à créer l'image docker avant de déployer le cluster de votre essaim.

Utilisez la commande docker build pour créer l'image docker; Poussez l'image créée vers un (public ou privé) docker registry; et référencez-le dans votre fichier docker compose.

13
François Maturel

Si quelqu'un est encore là-dessus, vous pouvez marquer l'image construite dans compose en définissant le paramètre image avec le paramètre de construction, comme vous pouvez le voir dans la section de construction de docs . Le fichier devrait donc ressembler à:

version: '3'
services:
  db2server:
    image: <your registry here>/db2server
    build: ./db2server
    ports:
      - "50005:50000"
    command: ["db2start"]
  appruntime:
    image: <your registry here>/appruntime
    build: ./appruntime
    depends_on:
     - db2server

alors vous pouvez faire:

docker-compose build
docker-compose Push
docker stack deploy -c /home/docker/docker-compose.yml app
9
vlizana

Le fichier de composition sert aux deux outils: docker-compose Cli et docker stack Cli. les options "build" fonctionnent dans docker-compose mais sont ignorées par les commandes de pile, et les options "deploy" fonctionnent dans les commandes de pile mais sont ignorées par docker-compose.

Swarm n'est pas conçu pour créer vos images pour vous. Il suppose que vos images sont disponibles dans un registre d'images. Plusieurs nœuds dans un Swarm ne peuvent pas partager d'images les uns avec les autres, donc un registre (distant ou en cours d'exécution sur le Swarm lui-même) est le seul moyen pour tous de s'assurer qu'ils peuvent extraire la même image exacte.

Par conséquent, l'exemple typique consiste à demander à Docker Hub de créer automatiquement vos images en fonction des validations de code, ou à ce que votre plate-forme CI/CD crée les images et envoie à un registre. Vos commandes stack deploy Extrairont alors l'image appropriée de ce registre.

3
Bret Fisher