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 run
(docker-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
在绑定挂载 之前 执行,并被它覆盖。
我在 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 run
(docker-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
在绑定挂载 之前 执行,并被它覆盖。