Bind Mount & Volumes: файлы не попадают в контейнер? - PullRequest
0 голосов
/ 12 мая 2019

Я потею из-за странной проблемы. Я монтирую папку с хост-машины в контейнер (только для разработки). Папка называется dj_docker и содержит папку dj_docker/media с некоторыми файлами .pdf, которые должны оказаться в контейнере и должны быть доступны для других контейнеров через том media_volume. Тем не менее, как только я сопоставляю подкаталог /media с томом (монтирование привязки и том теперь включают в себя папку /media), все содержимое папки исчезает в контейнере. Папка пуста.

Упрощенный docker-compose.yml:

version: '3.7'

services:
  restapi:
    volumes: 
      - media_volume:/usr/src/dj/media
      - ./dj_docker:/usr/src/dj/
volumes:
  static_volume:
  media_volume:

Если я опускаю том в файле docker-compose, файлы .pdf видны и присутствуют в контейнере:

    volumes: 
      - ./dj_docker:/usr/src/dj/

Можно ли по-прежнему использовать привязку, а также том, где я храню файлы в контейнере?

Dockerfile

# pull official base image
FROM python:3.7-alpine

# set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# set work directory
WORKDIR /usr/src/dj

# install psycopg2
RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add postgresql-dev \
    && pip install psycopg2 \
    && apk del build-deps

# install dependencies
RUN pip install --upgrade pip
COPY ./requirements.txt /usr/src/dj/requirements.txt
RUN pip install -r requirements.txt
VOLUME /usr/src/dj/media

# copy entrypoint.sh
COPY ./entrypoint.sh /usr/src/dj/entrypoint.sh

# run entrypoint.sh
ENTRYPOINT ["/usr/src/dj/entrypoint.sh"]

1 Ответ

4 голосов
/ 12 мая 2019

Есть ли способ по-прежнему использовать привязку, а также том, где я храню файлы в контейнере?

Нет, это невозможно.

Это то же самое, что и обычное Un * x mount (8) (и на самом деле, если вы возитесь с низкоуровневыми инструментами, вы увидите монтирование файловой системы в настройке Docker).Монтирование тома полностью скрывает все, что было в каталоге раньшеЕсли у вас есть многослойное монтирование, подобное этому, Docker сортирует их перед применением любого, а самое внутреннее монтирование каталога скрывает содержимое этого каталога в следующем внешнем монтировании.

Легче всего изменить здесь, вероятно, контейнер.боковой каталог, содержащий эти данные.Я мог бы выбрать путь к корневому каталогу, например /media, вне дерева установки вашего приложения.Задайте местоположение с помощью переменной среды (она отличается в вашей среде разработки, отличной от Docker).Скопируйте начальный контент туда при запуске, если он не существует (теперь он не будет скрыт монтированием тома).

...