【发布时间】:2019-05-12 10:04:40
【问题描述】:
我正在为一个奇怪的问题而苦恼。我正在将一个文件夹从主机安装到容器(仅用于开发)。该文件夹称为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"]
【问题讨论】:
-
你没有重复的路径吗? dj 文件夹包含被 media_volume 覆盖的媒体文件夹
-
是的,我怀疑会发生这种情况(尽管预期的行为会是合并)......但我仍然需要从容器/卷中的本地机器获取文件
-
嗯,这不可能合并...你需要为卷设置不同的路径
-
@Xen_mar 很抱歉给您带来不便。我同意具有 2 条不同路径的解决方案。如果您还没有这样做,您可以通过在 entrypoint.sh 中添加类似“cp -R /usr/src/dj/media/* /pdfs/”之类的内容来进一步自动化它。其中 /pdfs 是外部卷的容器挂载目录(- media_volume:/pdfs)。这将在每次重新启动服务时更新您的卷,无需在容器内进行手动操作。希望这会有所帮助
标签: docker docker-compose docker-volume