【问题标题】:Shared image volume mount error in dockerdocker中的共享映像卷挂载错误
【发布时间】:2018-05-31 18:08:16
【问题描述】:

我使用docker-composedocker 中运行我的容器。我有两个服务——一个是celerybeat,另一个是web(我还有很多其他服务,但只考虑这些服务,因为它们包含我的问题)。

docker-compose.yml 文件如下所示:

.
.
.

celerybeat:
  image: web-image
  volumes:
    - /home/ubuntu/celerybeat:/code/celerybeat
  command: >
    /bin/ash -c "su -m celery -c 'celery -A <application_here> beat -s /code/celerybeat/celerybeat-schedule'"

web:
  image: web-image
  volumes:
    - /home/ubuntu/celerybeat:/code/celerybeat
  command: >      
    <some_command_to_run_server>

在我的Dockerfile 中,我添加了这些命令以获得适当的权限

RUN mkdir celerybeat
RUN touch celerybeat/celerybeat-schedule
RUN chown -R celery:celery celerybeat

注意:在上面编写的 compose 文件结构中,我为两个容器提供了卷挂载(但实际上我一次使用一个),以便于不一次又一次地编写 compose 文件.

问题实际上只是在这里。从技术上讲,卷挂载应该只在 celerybeat 服务中提供。当我在 celerybeat docker 服务中为celerybeat-schedule 编写卷挂载时,我得到permission denied。而当我在 web 服务中编写卷挂载命令时,celerybeat 服务启动得很愉快。这里发生了什么有人可以解释一下吗?我需要解决这个问题。

【问题讨论】:

  • 当你说你在web service celerybeat 服务中写了卷挂载命令并且它启动得很愉快,你到底在运行什么命令?
  • 我解决了这个问题,尽管我仍然无法理解。问题是我正在以 celery 用户身份运行启动节拍服务的命令。但是当我在不添加su -m celery -c 位的情况下启动服务时,它起作用了。为什么会出现这个问题?

标签: django docker celery celerybeat


【解决方案1】:

您遇到的问题如下

volumes:
    - /home/ubuntu/celerybeat:/code/celerybeat

通过执行上述体积映射,您有效地取消了以下

RUN chown -R celery:celery celerybeat

并从卷挂载继承权限。解决方法是不使用 celery 用户或在您的 yaml 中使用以下

command: >
  /bin/ash -c "chown -R celery:celery /code/celerybeat && su -m celery -c 'celery -A <application_here> beat -s /code/celerybeat/celerybeat-schedule'"

【讨论】:

  • 感谢塔伦! :),同样的答案,给了他赞成票,因为“财富分配”
【解决方案2】:

操作顺序 - docker build 然后 docker rundocker-compose up 算作 docker run

当您挂载一个卷时,该卷中的文件和文件夹归根用户所有。如果您没有安装卷,拥有RUN chown -R celery:celery celerybeat 会起作用。当您在 docker run/docker-compose up 中绑定挂载卷时,/code/celerybeat 中存在的任何内容都会被覆盖,包括权限。

因此,当您以 root 身份运行 celerybeat 时,在这种情况下您就很好了。如果您尝试以 celery 用户身份运行它,则该用户无法访问 /code/celerybeat,因为作为绑定挂载卷,它归 root 所有。

在您的 Dockerfile 中运行 chown 而不是 chown 目录,作为入口点脚本的一部分。比如:

#!/bin/bash

chown -R celery:celery celerybeat
/bin/ash -c "su -m celery -c 'celery -A <application_here> beat -s /code/celerybeat/celerybeat-schedule'"

这个脚本,因此 chown,在绑定挂载之后执行,其中RUN chown -R celery:celery celerybeat 在绑定挂载之前执行,并被它覆盖。

【讨论】:

    猜你喜欢
    • 2021-07-04
    • 1970-01-01
    • 2018-10-29
    • 2014-12-08
    • 2021-10-03
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多