Смонтированный каталог пуст с помощью docker-compose и пользовательского Dockerfile - PullRequest
0 голосов
/ 28 сентября 2019

Я очень (читай очень) новичок в Docker, поэтому экспериментирую.Я создал очень простой Dockerfile для загрузки в Laravel:

FROM composer:latest
RUN composer_version="$(composer --version)" && echo $composer_version
RUN composer global require laravel/installer
WORKDIR /var/www
RUN composer create-project --prefer-dist laravel/laravel site

Мой файл docker-compose.yml выглядит так:

version: '3.7'

services:

    laravel:
        build:
            context: .
            dockerfile: laravel.dockerfile
        container_name: my_laravel
        network_mode: host
        restart: on-failure
        volumes:
            - ./site:/var/www/site

Когда я запускаю docker-compose up,.Каталог / site создан, но содержимое пусто.Я поместил это в docker-compose, так как планирую включить другие вещи, такие как nginx, mysql, php и т. Д.

Команда:

docker run -v "/where/i/want/data/site:/var/www/site" my_laravel

Результат такой же.

Я знаю, что установка прошла успешно, так как я изменил свой dockerfile, добавив к нему две строки:

WORKDIR /var/www/site
RUN ls -la

, что дает мне правильный список.

Ясно, что здесь что-то неправильно понято,Любая помощь приветствуется.

1 Ответ

1 голос
/ 28 сентября 2019

РЕДАКТИРОВАТЬ: Итак, я смог заставить это работать ... хотя, это немного сложнее, чем просто указать путь ..

Выэто можно сделать, указав том в docker-compose.yml. Путь к каталогу (на хосте) помечается как device в файле compose. Кажется, что корень пути должен быть фактическим томом (возможно, будет работать общий ресурс), но «местом назначения» пути может быть каталог на указанном томе.

Я создал новый том с именем docker на моей машине, но я полагаю, вы могли бы сделать это сваш существующий диск / том ..

Я на Mac, и этот файл docker-compose.yml работал для меня:

version: '3.7'
services:
  nodemon-test:
    container_name: my-nodemon-test
    image: oze4/nodemon-docker-test
    ports:
      - "1337:1337"
    volumes:
      - docker_test_app:/app    # see comment below on which name to use here

volumes:
  docker_test_app:              # use this name under `volumes:` for the service
    name: docker_test_app
    driver: local
    driver_opts:
       o: bind
       type: none
       device: /Volumes/docker/docker_test_app

указанный контейнер существует в моем DockerHub. это исходный код для него, на случай, если вы беспокоитесь о чем-либо злонамеренном.Я создал его, как две недели назад, чтобы помочь кому-то еще в StackOverflow .


Показывает файлы из контейнера на моей машине (хосте) ..

enter image description here


Вы можете узнать больше о конфигах Docker Volume здесь , если хотите.


ОРИГИНАЛЬНЫЙ ОТВЕТ:

Похоже, вы пытаетесь поделиться каталогом сборки с хост-машиной. После некоторого тестированияпохоже, что Docker перезапишет указанный путь в контейнере содержимым пути на хосте.

Если вы запустите docker logs my_laravel, вы увидите ошибку об отсутствующих файлах на /var/www/site .. Итак, даже если сборка прошла успешно - после того, как Docker установит каталог с вашего компьютера (./site) наcontainer (/var/www/site) перезаписывает путь в контейнере (/var/www/site) содержимым пути на вашем хосте (./site) - пустым.

Для проверки и проверки содержимогоиз /var/www/site фактически перезаписываются, вы можете запустить docker exec -it /bin/bash (вам может потребоваться заменить /bin/bash на /bash). Это даст вам доступ к командной строке внутри контейнера.Оттуда вы можете сделать ls -a /var/www/site ..

Кроме того, вы также можете предварительно подготовить ./site, чтобы в нем был случайный тестовый файл (test.txt или любой другой), затем docker-compose up -d, затем запуститьте же команды из шага выше docker exec -it ... и посмотрите, находится ли промежуточный файл test.txt внутри контейнера - это дает вам убедительное доказательство того, что при запуске volumes данные на вашем хосте перезаписывают данные в контейнере.

С учетом сказанного, будет делать что-то подобное и совместно использовать каталог журналов ... путь к тому, указанный в контейнере, все еще перезаписывается, разница в том, что контейнер записывает в негопуть ... он не зависит от конфигурационных файлов / файлов приложений.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...