目前,我正在尝试构建Django应用,其他用户应该可以用作Docker-Container。我希望他们轻松执行运行命令或启动预写的docker-compose文件以启动容器。
现在,我在数据持久性方面遇到问题。我在docker-compose中使用volume标志,例如,将主机的本地文件夹绑定安装到容器中,其中应用程序数据和配置文件位于容器中。主机文件夹在第一次运行时是空的,因为用户刚刚安装了docker并且正在启动docker-compose。
由于这是绑定安装,据我所知,空文件夹将覆盖Docker中的文件夹,因此包含Django-App的Container-Folder现在为空,因此无法启动。
我进行了一些搜索,据我所知,我需要创建一个entrypoint.sh文件,该文件在启动后将应用程序数据文件夹复制到容器的文件夹中,该卷位于该文件夹中。
现在我的问题:
我现在的示例代码:
Dockerfile
# pull official base image
FROM python:3.6
# set work directory
RUN mkdir /app
WORKDIR /app
# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# copy project
COPY . /app/
# install dependencies
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
#one of my tries to make data persistent
VOLUME /app
docker-compose.yml
version: '3.5'
services:
app:
image: app:latest
ports:
- '8000:8000'
command: python manage.py runserver 0.0.0.0:8000
deploy:
replicas: 1
restart_policy:
condition: on-failure
volumes:
- /folder/to/app/data:/app
networks:
- overlay-core
networks:
overlay-core:
external: true
entrypoint.sh
#empty for now
您应该重组应用程序,以将应用程序代码及其数据存储在不同的目录中。即使数据是应用程序的子目录,也足够了。完成此操作后,您可以仅绑定安装数据目录,并保留映像中的应用程序代码不变。
version: '3.5'
services:
app:
image: app:latest
ports:
- '8000:8000'
volumes:
- ./data:/app/data # not /app
没有特别的理由在Dockerfile中放置VOLUME
声明,但是您应该声明CMD
您的映像应在其中运行。