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

问题描述 投票:0回答:2

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

django docker celery celerybeat
2个回答
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在绑定装载之前执行,并被它覆盖。


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'"
© www.soinside.com 2019 - 2024. All rights reserved.