Django 打包为 docker 镜像

之前也想过将 django 项目打包成 docker 部署,但是由于之前的项目过于庞大,用到了系统的定时任务等各种系统服务,不知道打包成 docker 之后相关的服务是否依然能够启动,所以并未实施。

前几天做的我的足迹地图,项目相对来说比较独立,没有其他的依赖项,正好可以尝试一下。

首先在项目下创建 Dockerfile,写入以下内容:

# 使用官方Python运行时作为父镜像
FROM python:3.8.18-slim

# 设置工作目录
WORKDIR /app

# 将当前目录内容复制到位于/app中的容器中
COPY . /app


# 安装项目依赖
RUN pip install --no-cache-dir -r requirements.pip -i https://pypi.tuna.tsinghua.edu.cn/simple

# 暴露端口8000,与Django的默认运行端口一致
EXPOSE 10086

# 定义环境变量
ENV NAME=Django

# 在容器启动时运行Django的manage.py命令
CMD ["python", "manage.py", "runserver", "0.0.0.0:10086"]

网上代码来回抄,第二行都是FROM python:3.8-slim 如果这么写会导致下面的错误:

PS E:\Pycharm_Projects\BabyFootprintV2> docker build -t baby-footprint:1.0 .
[+] Building 21.2s (2/2) FINISHED docker:desktop-linux
 => [internal] load build definition from Dockerfile 0.0s
 => => transferring dockerfile: 568B 0.0s
 => ERROR [internal] load metadata for docker.io/library/python:3.8-slim 21.1s
------
 > [internal] load metadata for docker.io/library/python:3.8-slim:
------
Dockerfile:2
--------------------
   1 | # 使用官方Python运行时作为父镜像
   2 | >>> FROM python:3.8-slim
   3 |
   4 | # 设置工作目录
--------------------
ERROR: failed to solve: python:3.8-slim: failed to resolve source metadata for docker.io/library/python:3.8-slim: failed to do request: Head "https://registry-1.docker.io/v2/library/python/manifests/3.8-slim": dialing registry-1.docker.io:443 container via direct connection because has no HTTPS proxy: connecting to registry-1.docker.io:443: dial tcp 69.63.186.31:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

直接访问上面的网址docker.io/library/python:3.8-slim会发现根本没这么东西,所以要改成FROM python:3.8.18-slim

搜索一下,会有教程提示先下载 python3.8的 docker:

PS E:\Pycharm_Projects\BabyFootprintV2> docker pull python:3.8.18-slim
3.8.18-slim: Pulling from library/python
8a1e25ce7c4f: Pull complete
1103112ebfc4: Pull complete
b7d41b19b655: Pull complete
6a1ad0671ce8: Pull complete
de92c59aadaa: Pull complete
Digest: sha256:e796941013b10bb53a0924d8705485a1afe654bbbc6fe71d32509101e44b6414
Status: Downloaded newer image for python:3.8.18-slim
docker.io/library/python:3.8.18-slim

3.8.18是 ok 的,此时重新 build 即可:

PS E:\Pycharm_Projects\BabyFootprintV2> docker build -t baby-footprint:1.0 .
[+] Building 214.6s (9/9) FINISHED docker:desktop-linux
 => [internal] load build definition from Dockerfile 0.0s
 => => transferring dockerfile: 571B 0.0s
 => [internal] load metadata for docker.io/library/python:3.8.18-slim 0.0s
 => [internal] load .dockerignore 0.0s
 => => transferring context: 2B 0.0s
 => [1/4] FROM docker.io/library/python:3.8.18-slim 0.1s
 => [internal] load build context 0.9s
 => => transferring context: 43.30MB 0.8s
 => [2/4] WORKDIR /app 0.1s
 => [3/4] COPY . /app 0.2s
 => [4/4] RUN pip install --no-cache-dir -r requirements.pip -i https://pypi.tuna.tsinghua.edu.cn/simple 212.0s
 => exporting to image 1.4s
 => => exporting layers 1.4s
 => => writing image sha256:cba073b574f88f19be7487b29612e19b9826ab99e7b54ea748bd5df22e83e1a0 0.0s
 => => naming to docker.io/library/baby-footprint:1.0 0.0s

编译变成,就可以像 docker hub 推送镜像了,不过首先需要设置 tag,如果直接推送会提示下面的错误:

PS E:\Pycharm_Projects\BabyFootprintV2> docker push baby-footprint:1.0
The push refers to repository [docker.io/library/baby-footprint]
04013169f44d: Preparing
f7c443286fad: Retrying in 5 seconds
fd749af069d5: Retrying in 5 seconds
3482d4cd60de: Retrying in 5 seconds
370c0e78e3ea: Retrying in 5 seconds
a74bee0a48a5: Waiting
c8f253aef560: Waiting
a483da8ab3e9: Waiting
denied: requested access to the resource is denied

这个提示也比较坑人,由于 docker 被屏蔽,我一直以为是网络连接问题,直到后来才发现是路径问题。

通过下面的命令设置 tag 后 push:

docker tag baby-footprint:1.0 obaby/baby-footprint:1.0
PS E:\Pycharm_Projects\BabyFootprintV2> docker push obaby/baby-footprint:1.0
The push refers to repository [docker.io/obaby/baby-footprint]
04013169f44d: Pushed
f7c443286fad: Pushed
fd749af069d5: Pushed
3482d4cd60de: Pushed
370c0e78e3ea: Layer already exists
a74bee0a48a5: Pushed
c8f253aef560: Pushed
a483da8ab3e9: Layer already exists
1.0: digest: sha256:0d0c0989a64cc3f3e192e5c8e7bc4931676d49ab66d810061a1daec6b1a6af58 size: 2000

受限于网络问题,可能会 push 失败,多重试几次就 ok 了。

最后就可以直接 docker 安装运行啦:

docker push obaby/baby-footprint:tagname

☆版权☆

* 网站名称:obaby@mars
* 网址:https://obaby.org.cn/
* 个性:https://oba.by/
* 本文标题: 《Django 打包为 docker 镜像》
* 本文链接:https://obaby.org.cn/2024/11/18624
* 短链接:https://oba.by/?p=18624
* 转载文章请标明文章来源,原文标题以及原文链接。请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。


You may also like

33 comments

  1. Level 6
    Google Chrome 109 Google Chrome 109 Windows 10 Windows 10 cn中国–上海–上海 腾讯云

    评论框顶端没边框线条,强迫症表示不可忍

    灵妹妹换成什么路由器了呀

    1. 公主 Queen 
      Google Chrome 126 Google Chrome 126 Mac OS X 10.15 Mac OS X 10.15 cn中国–山东–青岛 联通

      我也没搞明白为啥第一个没有,哈哈哈
      没换,返厂修

      1. Level 6
        Google Chrome 109 Google Chrome 109 Windows 10 Windows 10 cn中国–上海–上海 腾讯云

        #comment-list > .comment:first-child > .comment-body {
        border-top: none;
        }

        去掉这句

        1. 公主 Queen 
          Google Chrome 126 Google Chrome 126 Mac OS X 10.15 Mac OS X 10.15 cn中国–山东–青岛 联通

          这个需要改主题的文件,换了个方法改好了。

          1. Level 6
            Google Chrome 109 Google Chrome 109 Windows 10 Windows 10 cn中国–上海–上海 腾讯云

            6,灵妹妹加了个:border-top: 1px dashed #ff7aa4 !important;
            权重更高的样式覆盖前面

      2.  Level 3
        Google Chrome 109 Google Chrome 109 Windows 10 Windows 10 cn中国–河南–濮阳 电信

        我感觉第一个框上边你可以加入一个占位符解决,。只是我感觉哈。我不懂

  2. Level 4
    Google Chrome 130 Google Chrome 130 Android 10 Android 10 cn中国–江苏–南京 联通

    早上博客好像打不开了,我rss也没拉到你的,评论区样式改了?

  3.  Level 3
    Google Chrome 109 Google Chrome 109 Windows 10 Windows 10 cn中国–河南–濮阳 电信

    我感觉第一个框上边你可以加入一个占位符解决,。只是我感觉哈。我不懂

  4. Level 2
    Google Chrome 127 Google Chrome 127 GNU/Linux GNU/Linux cn中国–贵州–贵阳 移动

    出于安全方面着想 直接使用docker run来启动容器会不会有一定的暴露风险呢😳 如果用docker-compose或Kubernetes工具来管理容器会不会更好些

    1. 公主 Queen 
      Google Chrome 126 Google Chrome 126 Mac OS X 10.15 Mac OS X 10.15 cn中国–山东–青岛 联通

      本质上没区别吧,docker 不都是这么用的吗?

      1. Level 3
        Microsoft Edge 129 Microsoft Edge 129 Windows 10 Windows 10 pl波兰

        docker-compose只是一种docker命令的增强版,对于运行复杂的项目有帮助,而简单的项目并不一定需要。

  5. Level 3
    Microsoft Edge 129 Microsoft Edge 129 Windows 10 Windows 10 pl波兰

    Docker个人理解它的主要是用途是运行环境的管理,如果真的是一些大型的应用,或是应用更新换代较快的话,可以考虑使用目录外挂载的方式把应用安装介质加载到Docker镜像就可以,这样也可以减小Docker镜像的大小,便于传输与分享。

    1. 公主 Queen 
      Google Chrome 126 Google Chrome 126 Mac OS X 10.15 Mac OS X 10.15 cn中国–山东–青岛 联通

      是的,这个还是有必要的额。尤其是资源文件。

  6.  Level 6
    IBrowse r IBrowse r Android 12 Android 12 cn中国–河南–漯河 联通

    Docker恐惧症患者表示看不懂(⊙o⊙)哇,弱弱问下,服务器重启Docker会丢失吗?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注