web-dev-qa-db-fra.com

Ajout de fichiers à des images standard à l'aide de docker-compose

Je ne sais pas si quelque chose d'évident m'échappe ou si ce n'est tout simplement pas possible, mais j'essaie de composer une pile d'applications complète avec des images du docker hub. 

L'un d'eux est mysql. Il prend en charge l'ajout de fichiers de configuration personnalisés via des volumes et l'exécution de fichiers .sql à partir d'un répertoire monté. 

Mais, j'ai ces fichiers sur la machine sur laquelle j'exécute docker-compos, pas sur l'hôte. N'y a-t-il aucun moyen de spécifier des fichiers de l'ordinateur local à copier dans le conteneur avant qu'il ne le lance entrypoint/cmd? Dois-je vraiment créer des images locales de tout, uniquement pour ce cas?

18
Andreas Wederbrand

Option A: Inclure les fichiers dans votre image. Ceci est moins qu'idéal car vous mélangez des fichiers de configuration avec votre image (qui ne devrait contenir que vos fichiers binaires, pas votre configuration), mais satisfait à la nécessité d'utiliser uniquement docker-compose pour envoyer les fichiers.

Cette option est obtenue en utilisant docker-compose pour construire votre image. Cette construction envoie tous les fichiers du répertoire de construction au moteur de docker distant. Votre docker-compose.yml ressemblerait à ceci:

version: '2'

services:
  my-db-app:
    build: db/.
    image: custom-db

Et db/Dockerfile ressemblerait à ceci:

FROM mysql:latest
COPY ./sql /sql

Le entrypoint/cmd resterait inchangé. Vous devez exécuter docker-compose up --build si l'image existe déjà et vous devez modifier les fichiers SQL.


Option B: Utilisez un volume pour stocker vos données. Cela ne peut pas être fait directement dans docker-compose. Cependant, c'est le moyen préféré pour inclure des fichiers extérieurs à l'image dans le conteneur. Vous pouvez renseigner le volume sur le réseau à l'aide de la CLI du menu fixe et de la redirection des entrées, ainsi que d'une commande telle que tar pour compresser et décompresser les fichiers envoyés via stdin:

tar -cC sql . | docker run --rm -it -v sql-files:/sql \
  busybox /bin/sh -c "tar -xC /sql"

Exécutez-le via un script, puis laissez le même script rebondir le conteneur de base de données pour recharger cette configuration.


Option C: Utilisez une sorte de système de fichiers connecté au réseau. Si vous pouvez configurer NFS sur l'hôte sur lequel vous exécutez votre interface de ligne de commande docker, vous pouvez vous connecter à ces partages NFS à partir du nœud de docker distant à l'aide de l'une des options ci-dessous:

# create a reusable volume
$ docker volume create --driver local \
    --opt type=nfs \
    --opt o=addr=192.168.1.1,rw \
    --opt device=:/path/to/dir \
    foo

# or from the docker run command
$ docker run -it --rm \
  --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/Host/path \
  foo

# or to create a service
$ docker service create \
  --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/Host/path \
  foo

Option D: En mode Essaim, vous pouvez inclure des fichiers comme configuration dans votre image. Cela permet aux fichiers de configuration, qui devraient normalement être poussés vers n’importe quel nœud de l’essaim, d’être envoyés sur demande au nœud sur lequel votre service est exécuté. Cela utilise un fichier docker-compose.yml pour le définir, mais le mode Swarm n'utilise pas Docker-Compose, ce qui risque de ne pas répondre à vos besoins spécifiques. Vous pouvez exécuter un cluster en mode swarm à un seul nœud. Cette option est donc disponible même si vous n’avez qu’un seul nœud. Cette option nécessite que chacun de vos fichiers SQL soit ajouté en tant que configuration distincte. Le docker-compose.yml ressemblerait à ceci:

version: '3.4'

configs:
  sql_file_1:
    file: ./file_1.sql

services
  my-db-app:
    image: my-db-app:latest
    configs:
      - source: sql_file_1
        target: /sql/file_1.sql
        mode: 444

Ensuite, au lieu d’un docker-compose up, vous exécuteriez un docker stack deploy -c docker-compose.yml my-db-stack.

22
BMitch

Voici comment je le fais avec les volumes:

services:
  my-db-app:
    command: /Shell_scripts/go.sh
    volumes:
      - ./Shell_scripts:/Shell_scripts 
4
Adam Spence

Mise à jour plus récente de cette question: avec un swarm docker hébergé sur Amazon, par exemple, vous pouvez définir un volume pouvant être partagé par des services et disponible sur tous les nœuds du swarm (à l’aide du pilote cloudstor qui à son tour a AWS EFS sous-jacent pour la persistance). 

version: '3.3'
services:
  my-db-app:
    command: /Shell_scripts/go.sh
    volumes:
      Shell_scripts:/Shell_scripts 
volumes:
    Shell_scripts:
      driver: "cloudstor:aws"
0
Eoan

je pense que vous deviez faire dans un fichier de composition:

volumes:
 - src/file:dest/path
0
Cristian Monti