我使用docker-compose
在docker
中运行我的容器。我有两个服务 - 一个是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服务开始很愉快。这里发生了什么事有人能解释我吗?我需要修复此问题。
答案 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 run
(docker-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
在绑定装载之前执行,并被它覆盖。