IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Django 打包为 docker 镜像

    obaby发表于 2024-11-25 05:51:12
    love 0

    之前也想过将 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
    
    



沪ICP备19023445号-2号
友情链接