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用dockerfile创建的tomcat镜像