绑定挂载和卷:文件不会最终出现在容器中吗?

时间:2019-05-12 10:04:41

标签: docker docker-compose docker-volume

我正在为一个奇怪的问题出汗。我正在将文件夹从主机安装到容器(仅用于开发)。该文件夹称为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"]

2 个答案:

答案 0 :(得分:4)

  

还有什么方法可以将绑定文件以及卷保持在容器中吗?

不,这是不可能的。

这与普通的Un * x mount (8)相同(实际上,如果您使用低级工具进行测试,您将在Docker设置中看到文件系统安装)。卷安装完全隐藏了目录中的所有内容。如果您具有这样的分层挂载,则Docker在应用任何挂载之前对其进行排序,并且最里面的目录挂载会将目录中的内容隐藏在下一个最外面的挂载中。

最简单的更改可能是保存此数据的容器侧目录。我可能会在应用程序的安装树之外选择一个像/media这样的根目录路径。通过环境变量设置位置(在非Docker开发环境中有所不同)。如果种子内容不存在,则在启动时将其复制到那里(现在不会被卷装载隐藏)。

答案 1 :(得分:0)

您既可以拥有主机卷又可以拥有命名卷,但是有一个技巧可以使其工作。本文应该解决您的问题:https://jdlm.info/articles/2019/09/06/lessons-building-node-app-docker.html