我使用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服务开始很愉快。这里发生了什么事有人能解释我吗?我需要修复此问题。
操作顺序 - 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
在绑定装载之前执行,并被它覆盖。
你遇到的问题如下
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'"