【问题标题】:Docker: mounting local directories as a non-root user in a containerDocker:在容器中以非 root 用户身份挂载本地目录
【发布时间】:2015-06-06 11:45:12
【问题描述】:

我在互联网上阅读了很多关于如何以最佳方式将本地(项目)目录挂载到 Docker 容器中的帖子,以便这些目录不属于 root 用户。不幸的是,我没有找到准确的答案。

我正在使用这个 docker-compose.yml (SfDocker) 文件构建我的开发堆栈:

db:
    image: mysql:latest
    ports:
    - "3306:3306"
    environment:
        MYSQL_ROOT_PASSWORD: symfonyrootpass
        MYSQL_DATABASE: symfony
        MYSQL_USER: symfony
        MYSQL_PASSWORD: symfonypass
worker:
    image: symfony/worker-dev
    ports:
    - "8080:80"
    environment:
        XDEBUG_HOST: 192.168.1.194
        XDEBUG_PORT: 9000
        XDEBUG_REMOTE_MODE: req
    links:
    - db
    volumes:
    - "var/nginx/:/var/log/nginx"
    - symfony-code:/var/www/app

只有在构建镜像之后才会在运行时挂载卷。我在symfony/worker-dev 映像中添加了RUN groupadd -r luqo33 && useradd -r -g luqo33 luqo33 的新用户,但我无法chmod 安装的卷,因此它归luqo33:www-data 所有。我试过这样做:

  1. 使用chmod 命令复制并运行entrypoint.sh

    复制 entrypoint.sh /entrypoint.sh 运行 chmod +x /entrypoint.sh 入口点 ["/entrypoint.sh"]

容器会在没有明显原因的情况下启动然后关闭。

  1. 在启动容器时执行 CMD chown -R luqo33:www-data - 这不起作用,因为在启动 worker-dev 容器时,卷似乎尚未安装。

我没有设法将挂载目录的所有权设置给root 以外的用户。我怎样才能做到这一点?

【问题讨论】:

  • " 在启动 worker-dev 容器时,卷似乎尚未安装。"你在 Mac 上使用 boot2docker 吗?

标签: docker containers


【解决方案1】:

您似乎对 Docker 的工作方式有些困惑,尤其是在入口点和 cmd 脚本方面。

在 ENTRYPOINT 或 CMD 指令中引用的任何脚本都将由容器在运行时执行。脚本完成后,容器将退出。因此,您需要运行 chmod 并在脚本中启动应用程序。

如果当前用户是 root,类似以下的脚本应该可以正常设置权限并启动应用程序:

#!/bin/bash

chown -R luqo33:www-data /var/www/app
sudo -u luqo33 exec start-my-app-in-foreground-script-or-bin

但是,sudo 创建两个进程有一点问题,所以你可能想改用gosu

【讨论】:

  • 嗨阿德里安。再次感谢您的帮助。 “您将需要运行 chmod 并在脚本中启动应用程序”。这是否意味着我必须运行chown 脚本然后再次启动容器(因为它会在运行chown 后退出)命令?另外,我应该先ADD 脚本文件,然后在我的Dockerfile 中通过CMD 执行它吗?
  • 是的,你必须先add
  • 这里没有“重新启动容器”,你在运行chown后在脚本中启动它,看看我的例子。是的,您需要先复制或添加脚本并在 ENTRYPOINT 或 CMD 指令中引用它。也许你应该看看在线文档或教程?
  • @AdrianMouat,我不确定我应该如何start-my-app-in-foreground-script-or-bin,因为我尝试运行的容器是带有 php-fpm 的 nginx。它应该始终运行,以便为网站提供服务(该网站是我要更改所有权的已安装目录)。在设置正确的所有权后它会退出有点烦人 - 我希望它继续运行/对不起,我现在真的对 Docker 感到困惑。我浏览了文档,但我肯定需要再读一遍。
  • 是的,恐怕这只是基本的 unix 东西。您要做的就是在前台启动 nginx,这样如果您愿意,它就会成为正在运行的应用程序(实际上脚本没有完成)。如果你只需要启动 nginx,它只是 "nginx -g "daemon off;" 或类似的。如果你需要启动更多进程,请查看 supervisord 或 runit。
猜你喜欢
  • 2019-08-19
  • 2018-06-18
  • 2021-05-29
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多