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

Shared image volume mount error in docker

我在 docker 中使用 docker-compose 作为 运行 我的容器。我有两项服务 - 一项是 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

注意:在我上面写的撰写文件结构中,我为两个容器提供了卷挂载(但实际上我一次使用一个),以便于不再编写撰写文件并且再次.

其实问题只出在这里。从技术上讲,volume mount 应该只在 celerybeat 服务中提供。当我在 celerybeat docker 服务中为 celerybeat-schedule 写入卷装载时,我得到 permission denied。而当我在 Web 服务中编写 volume mount 命令时,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'"

操作顺序 - docker build 然后 docker rundocker-compose up 算作 docker run

安装卷时,该卷中的文件和文件夹归 root 所有。如果您不安装卷,则 RUN chown -R celery:celery celerybeat 会起作用。当您在 docker run/docker-compose up 中绑定安装卷时,/code/celerybeat 中存在的任何内容都将被覆盖,包括权限。

所以当你 运行 celerybeat 作为 root 时,你在这种情况下很好。如果您 运行 像您尝试的那样以 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 在绑定挂载 之前 执行,并被它覆盖。