Bind Mount & Volumes:文件不会在容器中结束?
Bind Mount & Volumes: Files do not end up in the container?
我正在为一个奇怪的问题而苦恼。我正在将一个文件夹从主机安装到容器(仅用于开发)。该文件夹名为 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"]
Is there a way to still use a bind mount as well as the volume with me keeping the files in the container?
不,这不可能。
这与普通的 Un*x mount(8) 相同(事实上,如果您使用 low-level 工具四处寻找,您会看到文件系统挂载在Docker 设置)。卷安装完全隐藏了之前目录中的所有内容。如果你有这样的分层安装,Docker 在应用任何之前对它们进行排序,最里面的目录安装隐藏下一个最外层安装的目录中的内容。
这里最容易更改的可能是保存此数据的 container-side 目录。我可能会在应用程序的安装树之外选择根目录路径,如 /media
。通过环境变量设置位置(在您的 non-Docker 开发环境中有所不同)。如果种子内容不存在,则在启动时将其复制到那里(现在不会被卷挂载隐藏)。
您可以同时拥有主机卷和命名卷,但有一个技巧可以让它发挥作用。这篇文章应该可以解决您的问题:https://jdlm.info/articles/2019/09/06/lessons-building-node-app-docker.html.
我正在为一个奇怪的问题而苦恼。我正在将一个文件夹从主机安装到容器(仅用于开发)。该文件夹名为 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"]
Is there a way to still use a bind mount as well as the volume with me keeping the files in the container?
不,这不可能。
这与普通的 Un*x mount(8) 相同(事实上,如果您使用 low-level 工具四处寻找,您会看到文件系统挂载在Docker 设置)。卷安装完全隐藏了之前目录中的所有内容。如果你有这样的分层安装,Docker 在应用任何之前对它们进行排序,最里面的目录安装隐藏下一个最外层安装的目录中的内容。
这里最容易更改的可能是保存此数据的 container-side 目录。我可能会在应用程序的安装树之外选择根目录路径,如 /media
。通过环境变量设置位置(在您的 non-Docker 开发环境中有所不同)。如果种子内容不存在,则在启动时将其复制到那里(现在不会被卷挂载隐藏)。
您可以同时拥有主机卷和命名卷,但有一个技巧可以让它发挥作用。这篇文章应该可以解决您的问题:https://jdlm.info/articles/2019/09/06/lessons-building-node-app-docker.html.