Sanic over alpine:latest(3.9) 的 Docker 镜像使用 python json 而不是 ujson

Posted

技术标签:

【中文标题】Sanic over alpine:latest(3.9) 的 Docker 镜像使用 python json 而不是 ujson【英文标题】:Docker image with Sanic over alpine:latest(3.9) uses python json instead of ujson 【发布时间】:2019-07-06 02:06:00 【问题描述】:

Dockerfile:

FROM alpine:latest

RUN apk add --no-cache python3 \
    && python3 -m ensurepip \
    && rm -r /usr/lib/python*/ensurepip \
    && pip3 install -U pip setuptools ez_setup \
    && rm -r /root/.cache/* \
    && apk add --no-cache gcc autoconf python3-dev musl-dev make openssl-dev \
    && pip3 install -U sanic \
    && apk del gcc autoconf python3-dev musl-dev make openssl-dev \
    && rm -rf /var/cache/apk/* /var/tmp/* /tmp/* /root/.cache/*

WORKDIR /app
COPY . /app

EXPOSE 8000
CMD ["python3", "./app.py"]

Sanic 服务器:

from sanic import Sanic
from sanic.response import json
from datetime import datetime as dt

app = Sanic()


@app.route("/")
async def test(request):
    return json(
        "hello": "world",
        "date_is": dt.utcnow()
    )

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000)

使用 docker 镜像运行 Sanic 服务器返回 500:

TypeError: 'datetime' 类型的对象不是 JSON 可序列化的

但是从命令行运行这个服务器应用就可以了。

更有趣的是,如果使用 Alpine linux 3.8 版,该服务器应用程序可以正常工作。

我认为 Sanic 服务器找不到 ujson 包并使用默认的 python json。

有人对如何解决这个问题有任何建议吗?

【问题讨论】:

这很奇怪,Sanic 依赖于 ujson。第 82 行:github.com/huge-success/sanic/blob/master/setup.py。如果没有找到 ujson,不确定 sanic 是否会退回到 json.. 是的,如果 ujson 不可用,它将回退到常规 json 模块。但是你应该能够让它运行,我在 alpine 上没有遇到问题。事实上,“官方”的 Sanic 形象是基于 alpine 的。 hub.docker.com/r/sanicframework/sanic 【参考方案1】:

尝试从 git master 源安装 ujson

https://github.com/esnme/ultrajson/issues/326

【讨论】:

以上是关于Sanic over alpine:latest(3.9) 的 Docker 镜像使用 python json 而不是 ujson的主要内容,如果未能解决你的问题,请参考以下文章

Alpine linux安装docker

基于alpine用dockerfile创建的nginx镜像

基于alpine用dockerfile创建的tomcat镜像

基于alpine用dockerfile创建的ssh镜像

Sanic二十九:Sanic 扩展之sanic-session的使用

Sanic八:Sanic操作cookie