docker - 绑定挂载和卷:文件最终不会在容器中?
问题描述
我正在为一个奇怪的问题出汗。我正在将一个文件夹从主机安装到容器(仅用于开发)。该文件夹被调用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"]
解决方案
有没有办法仍然使用绑定挂载以及我将文件保存在容器中的卷?
不,这是不可能的。
这与普通的 Un*x挂载(8) 相同(事实上,如果您使用低级工具四处寻找,您会在 Docker 设置中看到文件系统挂载)。卷挂载完全隐藏了之前目录中的所有内容。如果你有这样的分层挂载,Docker 在应用任何之前对它们进行排序,最里面的目录挂载会在下一个最外面的挂载中隐藏该目录中的内容。
这里最容易更改的可能是保存这些数据的容器端目录。我可能会/media
在应用程序的安装树之外选择一个根目录路径,例如 。通过环境变量设置位置(在非 Docker 开发环境中不同)。如果种子内容不存在,则在启动时将其复制到那里(现在它不会被卷安装隐藏)。
推荐阅读
- python-3.x - 在 BeautifulSoup / Python 中,如何从结果集中提取单个元素?
- laravel - 419 抱歉,您的会话已过期。请刷新并重试。提交表单时出现此错误
- r - 错误:尝试在 For 循环中使用零长度变量名
- sql - 基于最小值分组时选择一条记录
- java - 如何在新方法中使用来自两种不同方法的变量?
- python - 使用 django-python3-ldap 更改 LDAP 密码加密
- javascript - 更新父组件状态时反应子组件不重新渲染
- javascript - Actionmethod 无法从 ajax post 获取参数中的双值
- c# - Asp.net Core Web API - 将多个图像从 blob 存储下载到 zip 文件(通过 Axios 获取)
- angular - UI-路由器混合:在触发带有 NG2 组件的 NG1 状态之前,NG2 状态不起作用