web-dev-qa-db-fra.com

docker-compose sur le volume Windows ne fonctionne pas

J'ai joué avec Docker la semaine dernière et je pense que l'idée de conteneur est très utile, mais malgré la lecture de tout ce que je peux au cours des 3 derniers jours, je ne peux pas faire fonctionner le mappage de volume

get docker-compose to use my existing volume.

    Docker Version: 18.03.1-ce
    docker-compose version 1.21.1, build 7641a569

I created a volume using the following via a Dockerfile

    # Reference SQL image
    FROM Microsoft/mssql-server-windows-developer

    # Create directory within SQL container for database files mapped to the    volume
    VOLUME sqldata:c:/MSSQL

and here it shows:
    C:\ProgramData\Docker\volumes>docker volume ls
    local               sqldata

Now I've tried probably 60+ different "solutions" based on StackOverflow and Docker forums, but none of them work. (Note despite the names below with Azure I am simply trying to get this to run locally, Azure is next hurdle)

    Docker-compose.yaml:

    version: '3.4'
    services:
      ws:
        image: wsManager
        container_name: Azure-wcf
        ports:
           - "80"
        depends_on:
            - db

      db:
        image: dbimage:latest
        container_name: Azure-db
        volumes:
             - \sqldata:/mssql
#            - type: volume
#              source: sqldata
#              target: /mssql
        ports:
            - "1433"

I've added a volumes section but it does not help, 

    volumes:
        sqldata:
            external:
                name: sqldata

    changed the - \sqldata:/mssql
    to every possible slash .. . ~ whatever.  Moved the file to yaml file 

à C:\ProgramData\Docker\volumes - essentiellement toute suggestion qui apparaît dans mes résultats de recherche. Le dbImage est une image SQL Server dont j'ai besoin pour conserver les données mais je me demande quelle est la magie car rien de ce que j'ai essayé ne fonctionne. Toute aide est grandement appréciée.

J'utilise Windows 10 Pro build 1803.

Pourquoi cela doit-il être si difficile? Que vous à quiconque sait comment faire en sorte que cela fonctionne réellement.

6
Maui_Ed

La solution consiste à référencer le vrai chemin sous Windows en utilisant l'option volumes: comme ci-dessous:

sqldb:
    image: sqlimage 
    container_name: Azure-db
    volumes:
      - "C:\\ProgramData\\Docker\\volumes\\sqldata:c:\\mssql"

Pour conserver les données, j'ai utilisé ce qui suit:

environment:
   - "sa_password=ddsql2017@@"
   - "ACCEPT_EULA=Y"
   - 'attach_dbs= {"dbName":"MyDb","dbFiles":"C:\\MSSQL\\MyDb.mdf","C:\\MSSQL\\MyDb.ldf"]}]'

J'espère que cela aide quelqu'un d'autre, car la plupart des exemples que j'ai trouvés en recherchant à la fois sur SO et ailleurs n'ont pas fonctionné pour moi, et dans les forums Docker, il y a beaucoup de messages disant que les volumes de montage ne fonctionnent pas pour Les fenêtres.

7
Maui_Ed

Je rencontrais des problèmes similaires lorsque j'essayais de monter un volume sur un chemin spécifique de ma machine Windows: fondamentalement, cela ne fonctionnait pas, donc à chaque redémarrage de mon instance Docker, je perdais toutes mes données de base de données. J'ai finalement découvert que c'est parce que Docker pour Windows par défaut ne peut pas interpréter le chemin Windows, donc l'indicateur COMPOSE_CONVERT_WINDOWS_PATHS doit être activé. Faire cela:

  • Exécutez la commande "set COMPOSE_CONVERT_WINDOWS_PATHS = 1"
  • Redémarrez Docker
  • Accédez à Paramètres> Lecteurs partagés> Réinitialiser les informations d'identification, puis sélectionnez le lecteur, puis appliquez
  • À partir de la ligne de commande, supprimez les conteneurs (docker container rm -f)
  • Réexécutez les conteneurs

J'espère que cela aide

2
flavio

Si les informations d'identification de votre compte Windows ont été modifiées, vous devez également réinitialiser les informations d'identification des lecteurs partagés. (Paramètres> Lecteurs partagés> Réinitialiser les informations d'identification)

Dans mon cas, le mot de passe a été modifié par la politique de sécurité de mon entreprise.

2
kimreik

Pour ceux qui utilisent Ubunto WSL:

  • Sudo mkdir /c
  • Sudo mount --bind /mnt/c /c
  • accédez à votre fichier de projet en utilisant un nouveau chemin (/ c/votre-chemin-de-projet et non/mnt/c/votre-chemin-de-projet)
  • éditez votre docker-compose.yml et utilisez le chemin relatif pour le volume: (comme ./src au lieu de c/your-project-path/src)
  • docker-compose up
0
aPa

Docker sous Windows a un comportement étrange car Windows a des limites avec les informations d'identification et également avec la machine virtuelle que Docker utilise (Hyper-V, VirtualBox - en fonction de votre version et configuration de Docker).

Fondamentalement, vous avez raison de mapper un dossier dans

volumes:

section à votre service:

Le chemin est

version: '3.4'
services:
  db:
    image: dbimage:latest
    container_name: Azure-db
    volumes:
         - c:/Temp/sqldata:/mssql

L'important est que vous n'avez pas besoin de créer explicitement le volume dans la section des volumes, mais le docker-compose up le créera (la même chose est pour le docker run).

Chose étrange, il ne se présentera jamais

docker volume ls

mais il sera utilisable avec les mêmes fichiers dans le répertoire windows et dans le chemin du conteneur/mssql

Vous pouvez le tester avec:

docker run --rm -v c:/Temp/sqldata:/data Alpine ls /data

ou

docker run --rm -v c:/Temp:/data Alpine ls /data

S'il disparaît, il a probablement perdu les informations d'identification et le réinitialiser via Docker-> Paramètres-> Lecteurs partagés-> Réinitialiser les informations d'identification.

J'espère que cela a été clair et a couvert tous les aspects pour vous.

0
zhrist

Par défaut, il semble qu'après l'installation de Docker sur Windows, le partage des pilotes est désactivé - vous ne pourrez donc pas utiliser les volumes (qui sont stockés sur des disques)

Activation d'un tel partage, via: Docker in tray - right click - Settings, m'a aidé, les volumes ont commencé à bien fonctionner. enter image description here

0
Alex Efimov