docker中共享的映像卷挂载错误

我使用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 

注意:在我上面写的组合文件结构中,我已经提供了两个容器的卷装(但实际上我一次只使用一个),以免再次写组合文件

问题实际上只在这里。 从技术上讲,只能在celerybeat服务中提供卷装。 当我在celerybeat docker服务中为celerybeat-schedule写入卷挂载时,我获得了permission denied 。 而当我在Web服务中写入卷装入命令时,celerybeat服务开始愉快。 这里发生了什么事,谁能解释我? 我需要修复这个。

操作顺序 – docker build然后docker run (与docker-compose up docker run计数。

装入卷时,该卷中的文件和文件夹由root拥有。 如果你没有装卷的话, RUN chown -R celery:celery celerybeat可以起作用。 当你在docker run / docker中绑定装入卷时,/ code / celerybeat中的任何内容都将被覆盖,包括权限。

所以当你以root身份运行celerybeat的时候,在这种情况下你是很棒的。 如果您像芹菜用户一样运行它,那么该用户将无法访问/ code / celerybeat,因为它是一个绑定挂载卷,它由root拥有。

不要在您的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, bind mount 之后执行,其中RUN chown -R celery:celery celerybeat 绑定挂载之前执行,并被它覆盖。

你有问题在下面

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

通过上面的体积映射,你可以有效的取消下面的内容

 RUN chown -R celery:celery celerybeat 

并从卷装载inheritance权限。 该修补程序要么不使用芹菜用户或在您的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'"