将 Django ContentFile 传递给 ImageField 不会在 Docker 上的磁盘上创建映像文件



当我不使用Docker容器时,下面的代码适用于本地。但是,当我尝试在Docker中运行相同的代码/项目时,尽管其他一切都很好,但下面的代码部分没有按预期工作,也没有将ContentFile作为图像文件保存到磁盘上。ImageField返回图像的路径,但实际上它并不存在。

from django.core.files.base import ContentFile
...
photo_as_bytearray = photo_file.get_as_bytearray()  # returns bytearray
cf = ContentFile(photo_as_bytearray)
obj.photo.save('mynewfile.jpg', cf)  # <<< doesn't create the file only on Docker

不确定我是否需要为Docker更改某些内容。

首先,问题的根源是我的Celery工人。它使用了与我的网络容器相同的图像,但是。。。

虽然我的web容器有一个与web文件夹相关联的卷(./web:/path/to/app(,以支持开发环境中的热重新加载,但芹菜工作人员没有使用此卷。我认为对两者使用相同的映像(mywebimage:dev(就足够了,但事实并非如此。

所以现在我将编辑我的docker compose文件,使它们都使用相同的(真正相同的(文件。Celery之所以使用web目录的副本,是因为Dockerfile中有copy语句,而不是我处理和编辑的实际目录。因此,当芹菜工作者创建一个文件时,它并不是在具有实际web目录的卷上创建的。

希望这能帮助犯了和我一样错误的人。

最新更新