Dockerize 现有的 Django 项目

问题描述 投票:0回答:3

我无法理解如何对现有 Django 应用程序进行 docker 化。 我已经阅读了 Docker 的官方手册,解释了如何在创建 Docker 映像期间创建 Django 项目,但我需要的是使用相同的方法对现有项目进行 dockerize。

这种方法的主要目的是我不需要一直在本地构建 docker 镜像,而是我想要实现的是将我的代码推送到附加了 docker-hub watcher 的远程存储库,并且一旦代码库已更新,它正在服务器上自动构建。

目前我的 Dockerfile 如下所示:

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install Django
RUN pip install djangorestframework
RUN pip install PyQRCode
ADD . /code/

任何人都可以解释一下我应该如何编写 Dockerfile 以及我是否需要使用

docker-compose.yml
(如果是:如何?)来实现我描述的功能?

本题解答:

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
RUN pip install *name of package*
RUN pip install *name of another package*
ADD . /code/
EXPOSE 8000
CMD python3 manage.py runserver 0.0.0.0:8000

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
EXPOSE 8000
CMD python3 manage.py runserver 0.0.0.0:8000

requirements.txt 应该是一个简单的包列表,例如:

Django==1.11
djangorestframework
pyqrcode
pypng
python django docker docker-compose dockerfile
3个回答
3
投票

这个问题太宽泛了。您创建的 Dockerfile 会发生什么?

你不需要 docker compose,除非你有多个容器需要交互。

当前 Dockerfile 的一些一般观察:

  • 最好将 pip install 命令折叠成单个语句。在 docker 中,每个语句都会创建一个文件系统层,而 pip install 命令之间的层可能没有任何用处。
  • 最好在 setup.py 或requirements.txt 文件(
    pip install -r requirements.txt
    )中声明依赖项,并使用固定版本号(
    foopackage==0.0.1
    )以确保可重复构建。
  • 我建议将 Django 应用程序打包到 python 包中并使用 pip (
    cd /code/; pip install .
    ) 安装它,而不是直接添加代码目录。
  • 您缺少执行应用程序的语句(CMD 或 ENTRYPOINT)。请参阅https://docs.docker.com/engine/reference/builder/#cmd

3
投票

警告:

-onbuild
图像已被弃用

@AlexForbes 提出了非常好的观点。但如果你想要一个超级简单的 Django

Dockerfile
,你可能可以这样做:

FROM python:3-onbuild
RUN python manage.py collectstatic
CMD ["python", "manage.py"]

然后您可以使用以下命令运行容器:

docker run myimagename runserver

小小的

-onbuild
修饰符可以满足您的大部分需求。它创建
/usr/src/app
,将其设置为工作目录,将所有源代码复制到其中,然后运行
pip install -r requirements.txt
(您忘记运行)。最后,我们收集静态数据(如果静态数据托管在某处,则您的情况可能不需要),并将默认命令设置为
manage.py
,以便一切都很容易运行。

如果您必须运行其他容器,如 Celery、Redis 或您的环境未提供的任何其他后台任务或服务器,则需要

docker-compose


1
投票

我实际上在https://rehalcon.blogspot.mx/2018/03/dockerize-your-django-app-for-local.html

中写了一篇关于此的文章

我的情况非常相似,但它添加了 MySQL 数据库服务和用于代码机密的环境变量,以及使用

docker-compose
(macOS 中需要)。我还使用 python:2.7-slim dockerparten 图像来代替,以使图像更小(低于 150MB)。

© www.soinside.com 2019 - 2024. All rights reserved.