码头中的共享图像卷安装错误

码头中的共享图像卷安装错误

问题描述:

我使用docker-composedocker中运行我的容器。我有两个服务--和其他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我已经添加了这些命令进行适当的权限

注:在我撰写的文件结构上面我所提供的卷安装书面对于两个容器(但实际上我一次只使用一个容器),因为不会一次又一次地写入组合文件

问题实际上只在这里。从技术上讲,只能在celerybeat服务中提供卷装。当我在celerybeat泊坞服务中写入celerybeat-schedule的卷装时,我得到permission denied。而当我在Web服务中写入卷装入命令时,celerybeat服务开始愉快。这里发生的事情有人能解释我吗?我需要解决这个问题。

+0

当你说你在Web服务celerybeat服务中写入卷装入命令并且它开始愉快时,你准确地运行了什么命令? – bluescores

+0

我解决了这个问题,但我仍然无法理解这一点。问题在于我正在运行用于作为芹菜用户启动节拍服务的命令。但是当我没有添加'su -m celery -c'的时候启动服务,它就起作用了。为什么会出现这个问题? –

阶以下使用 - 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'" 
+0

谢谢塔伦! :),同样的答案,因为“财富分配” –