【问题标题】:Passing Django ContentFile to an ImageField doesn't create an image file on the disk on Docker将 Django ContentFile 传递给 ImageField 不会在 Docker 上的磁盘上创建图像文件
【发布时间】:2021-03-11 23:53:36
【问题描述】:

当我不使用 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 进行更改。

【问题讨论】:

  • 您能举例说明返回的确切图像路径是什么吗?
  • 可能你要找的是 docker volumes stackoverflow.com/a/65507275/11544538
  • @ErsainD。是的,几乎。发布了一个小时后,我在尝试睡觉时找出了问题的根源,现在将发布答案。

标签: django docker


【解决方案1】:

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

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

所以现在我将编辑我的 docker-compose 文件以使它们都使用相同的(真正相同的)文件。由于 Dockerfile 中的 COPY 语句,Celery 使用了 web 目录的副本,而不是我工作和编辑的实际目录。因此,当 celery 工作人员创建文件时,它并没有在具有实际 Web 目录的卷上创建。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-01
    • 2013-04-11
    • 1970-01-01
    • 2018-02-25
    • 2018-09-14
    • 2023-03-29
    • 2021-09-16
    • 2015-02-22
    相关资源
    最近更新 更多