docker中的共享映像卷装入错误

时间:2017-12-18 11:43:40

标签: django docker celery celerybeat

我使用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服务中编写volume mount命令时,celerybeat服务开始很愉快。这里发生了什么事有人能解释我吗?我需要修复此问题。

2 个答案:

答案 0 :(得分:2)

您遇到的问题如下

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

通过执行上述卷映射,您可以有效地取消以下

RUN chown -R celery:celery celerybeat

并继承卷装入的权限。该修复程序要么不使用芹菜用户,要么使用下面的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'"

答案 1 :(得分:1)

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

装入卷时,该卷中的文件和文件夹归root所有。如果您没有装入卷,则RUN chown -R celery:celery celerybeat可以正常工作。绑定在docker run / docker-compose up中装入卷时,/ code / celerybeat中存在的任何内容都会被覆盖,包括权限。

所以当你以root身份运行celerybeat时,你就是这样的好人。如果您按照尝试的那样以celery用户身份运行它,则该用户无法访问/ code / celerybeat,因为作为绑定装载卷,它由root拥有。

而不是chown Dockerfile中的目录,运行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绑定装载之前执行,并被它覆盖。