Как обмениваться данными между хостом и контейнерами с помощью томов в Docker Compose

Я играю с Docker Compose и томами

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

Возьмем следующие факты:

  • У меня есть каталог под узлом: ~/var/www
  • Данные в таком каталоге должны сохраняться в отношении состояния контейнера.
  • Контейнер должен записывать данные с хоста в /var/www

Я прочитал docs здесь, но мне не ясно, как обращаться с томами данных и данными хоста.

Я хочу поделиться данными с хостом с контейнером, но я даже не знаю, правильно ли находится файл docker-compose.yml, или что нужно изменить, чтобы добиться того, что мне нужно. Я знаю, как это сделать, используя только docker run, но не имея подсказки для Docker Compose?

Может ли кто-нибудь помочь мне заставить это работать?

Обновление: игра с этим

Я добавил эти строки в файл docker-compose.yml:

    volumes_from:
        - volumes_source

И я снова запускаю docker-compose up, но это результат:

php55devwork_volumes_data_1 exited with code 0
php55devwork_volumes_source_1 exited with code 0

Я не уверен, что происходит или почему я получаю сообщение об ошибке?

Ответ 1

Похоже, вы пытаетесь определить "контейнер данных". Этот шаблон был обычным явлением, но это не обязательно после того, как система docker volume была добавлена ​​в Docker 1.9 (https://github.com/docker/docker/blob/master/CHANGELOG.md#190-2015-11-03)

Это изображение, которое вы используете, tianon/true, предназначено для запуска команды "истина", которая ничего не делает, кроме кода возврата 0, а затем выходит. Вот почему контейнер отображается как завершенный.

Вместо использования контейнеров данных используйте именованный том. Например, следующий подход с использованием контейнера данных:

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

становится следующим:

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

Поскольку вы используете compose, вы можете определять тома с помощью клавиши томов.

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

Подробная информация и пример находятся здесь: https://docs.docker.com/compose/compose-file/compose-file-v2/

Однако вы также упомянули, что хотите поделиться этими данными тома между контейнером и вашим хостом. В этом случае не требуется ни контейнер данных, ни названный том. Вы можете просто указать хост-объем напрямую:

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