web-dev-qa-db-fra.com

Comment partager des données entre l'hôte et les conteneurs à l'aide de volumes dans Docker Compose

Je joue avec Docker Compose et volumes

version: '2'
services:
    php-Apache:
        env_file:
          - dev_variables.env
        image: reypm/php55-dev
        build:
            context: .
            args:
                - PUID=1000
                - PGID=1000
        expose:
            - "80"
            - "9001"
        extra_hosts:
            # IMPORTANT: Replace with your Docker Host IP (will be appended to /etc/hosts)
            - "dockerhost:xxx.xxx.xxx.xxx"
        volumes_from:
            - volumes_source
    volumes_source:
        image: tianon/true
        volumes:
            - ../:/var/www
    volumes_data:
        image: tianon/true
        volumes:
            - ./data/sessions:/sessions

Prenons les faits suivants:

  • J'ai un répertoire sous l'hôte à: ~/var/www
  • Les données de ce répertoire doivent persister concernant l'état du conteneur.
  • Le conteneur doit écrire les données de l'hôte sous /var/www

J'ai lu des documents ici mais je ne sais pas comment gérer les volumes de données et les données de l'hôte.

Je souhaite partager les données sur l'hôte avec le conteneur, mais je ne sais même pas si le docker-compose.yml le fichier ci-dessus est correct ou ce qui doit être changé afin de réaliser ce dont j'ai besoin. Je sais comment faire en utilisant docker run seul mais n'a aucune idée de Docker Compose?

Quelqu'un peut-il m'aider à faire fonctionner cela?

Mise à jour: jouer avec cela

J'ai ajouté ces lignes au docker-compose.yml fichier:

    volumes_from:
        - volumes_source

Et je lance le docker-compose up encore une fois mais voici le résultat:

php55devwork_volumes_data_1 exited with code 0
php55devwork_volumes_source_1 exited with code 0

Je ne sais pas ce qui se passe ou pourquoi j'obtiens l'erreur, tout?

14
ReynierPM

Il semble que vous tentiez de définir un "conteneur de données". Ce modèle était habituel, mais ce n'est plus nécessaire après le docker volume le système a été ajouté dans Docker 1.9 ( https://github.com/docker/docker/blob/master/CHANGELOG.md#190-2015-11- )

Cette image que vous utilisez, tianon/true, est conçu pour exécuter la commande "true", qui ne fait rien d'autre que renvoyer le code de sortie 0, puis quitter. C'est pourquoi le conteneur s'affiche comme étant sorti.

Au lieu d'utiliser des conteneurs de données, utilisez un volume nommé. Par exemple, l'approche suivante utilisant un conteneur de données:

docker create --name data-container -v /sessions tianon/true
docker run --volume-from data-container -d myapp

devient ceci:

docker volume create --name sessions
docker run -v sessions:/sessions -d myapp

Puisque vous utilisez la composition, vous pouvez définir des volumes à l'aide de la clé des volumes.

version: '2'
services:
    php-Apache:
        env_file:
          - dev_variables.env
        image: reypm/php55-dev
        build:
            context: .
            args:
                - PUID=1000
                - PGID=1000
        expose:
            - "80"
            - "9001"
        extra_hosts:
            # IMPORTANT: Replace with your Docker Host IP (will be appended to /etc/hosts)
            - "dockerhost:xxx.xxx.xxx.xxx"
        volumes:
            - sessions:/sessions
            - docroot:/var/www
volumes:
    sessions:
        driver: local
    docroot:
        driver: local

Tous les détails et un exemple se trouvent ici: https://docs.docker.com/compose/compose-file/compose-file-v2/

Cependant, vous avez également mentionné vouloir partager ces données de volume entre le conteneur et votre hôte. Dans ce cas, ni un conteneur de données ni un volume nommé n'est nécessaire. Vous pouvez simplement spécifier un volume hôte directement:

version: '2'
services:
    php-Apache:
        env_file:
          - dev_variables.env
        image: reypm/php55-dev
        build:
            context: .
            args:
                - PUID=1000
                - PGID=1000
        expose:
            - "80"
            - "9001"
        extra_hosts:
            # IMPORTANT: Replace with your Docker Host IP (will be appended to /etc/hosts)
            - "dockerhost:xxx.xxx.xxx.xxx"
        volumes:
            - ./data/sessions:/sessions
            - ../:/var/www
24
programmerq