Docker:将本地目录作为非root用户安装在容器

时间:2015-06-06 11:45:12

标签: docker containers

我在互联网上阅读了很多关于如何将本地(项目)目录最好地安装到Docker容器中的线程,以便这些目录不归root用户所有。不幸的是,我没有找到准确的答案。

我正在使用此docker-compose.ymlSfDocker)文件构建我的开发堆栈:

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

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

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

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

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

    1. 在启动容器时执行CMD chown -R luqo33:www-data - 这可能无法正常工作,因为在启动worker-dev容器时,卷似乎尚未安装。
    2. 我没有设法将已安装目录的所有权设置为root以外的用户。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分: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