Docker:在容器中以非root用户的身份挂载本地目录

我已经在互联网上阅读了很多关于如何最好地将本地(项目)目录挂载到Docker容器中的线程,以便这些目录不被root用户拥有。 不幸的是,我还没有find确切的答案。

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

 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 

仅在构build映像后,才会在运行时装入卷。 我已经在symfony/worker-dev映像中RUN groupadd -r luqo33 && useradd -r -g luqo33 luqo33添加了一个新用户,但是我无法chmod已挂载的卷,因此它被luqo33:www-data 。 我试图做到这一点:

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

    COPY entrypoint.sh /entrypoint.sh RUN chmod + x /entrypoint.sh ENTRYPOINT [“/entrypoint.sh”]

集装箱将启动,然后closures,没有明显的原因。

  1. 在启动容器时执行CMD chown -R luqo33:www-data – 这不能工作,因为在启动worker-dev容器时,卷看起来还没有安装。

我没有设法将所安装的目录的所有权设置为root以外的root 。 我怎样才能做到这一点?

您似乎对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创build两个进程有一个小问题,所以你可能需要使用gosu 。