【问题标题】:Docker-compose and named volume permission deniedDocker-compose 和命名卷权限被拒绝
【发布时间】:2021-01-09 14:26:13
【问题描述】:

有 docker-compose 使用基础 Dockerfile 为应用程序创建映像。

Dockerfile 如下所示。由于某些原因,有些行被省略了。

FROM ubuntu:18.04

RUN set -e -x ;\
    apt-get -y update ;\
    apt-get -y upgrade ;

...

USER service

在 docker-compose 中使用此映像并将命名卷添加到服务时,命名卷中的文件夹无法访问,并显示消息 Permission denied。 docker-compose 的部分如下所示。

version: "3.1"
    services:
        myapp:
            image: myappimage
            command:
                - /myapp
            ports:
                - 12345:1234
            volumes:
                - logs-folder:/var/log/myapp

volumes:
    logs-folder:

我的假设是 USER service 行有问题,我通过在 myapp 服务中设置 user: root 确认了这一点。

现在,下一个问题。我想避免手动创建卷和设置权限。我希望它使用 docker-compose 实现自动化。

这可能吗?如果可以,怎么做?

【问题讨论】:

  • 你能在 docker compose 中做同样的事情吗?

标签: docker docker-compose


【解决方案1】:

是的,有一个技巧。不是真的在 docker-compose 文件中,而是在 Docker 文件中。在切换到service用户之前,您需要创建/var/log/myapp文件夹并设置其权限:

FROM ubuntu:18.04

RUN useradd myservice
RUN mkdir /var/log/myapp
RUN chown myservice:myservice /var/log/myapp

...

USER myservice:myservice

Docker-compose 将保留权限。

Docker Compose mounts named volumes as 'root' exclusively

【讨论】:

  • 谢谢,我害怕那个。我想避免这种情况,因为图像是使用 bazel 构建工具创建的,我不确定它会在哪里创建。我认为作为卷安装的主机文件夹也会出现同样的问题,对吗?
  • @EnterSB 使用主机文件夹更糟糕的是,上面的技巧不起作用。不过,还有另一个 hack。请参阅我对这个问题的回复:stackoverflow.com/a/64006395/9090751
  • 我会检查那个入口点服务。它可能比 Dockerfile 更有用、更干净,因为它的镜像只是我的 bazel 容器镜像创建程序的基础。
  • 您能在此处也添加第二个解决方案吗?我最终使用它而不是这个,它比更新图像更干净。非常感谢
【解决方案2】:

我遇到了类似的问题,但我的问题与通过卷共享到服务的文件有关,我不是使用 Dockerfile 构建的,而是拉取的。我分享了一个我在 docker-compose 中使用的 shell 脚本,但是当我执行它时,没有权限。

我在 docker compose 命令中使用 chmod 解决了这个问题

command: -c "chmod a+x ./app/wait-for-it.sh && ./app/wait-for-it.sh -t 150 -h ..."
volumes:
    - ./wait-for-it.sh:/app/wait-for-it.sh

【讨论】:

    猜你喜欢
    • 2022-06-23
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 2020-06-12
    • 1970-01-01
    相关资源
    最近更新 更多