在特定进程的开发环境中将docker作为非root用户运行

我正在继续学习Docker以及如何处理图像和容器。 我正在研究在工作中使用的图像。 这是Dockerfile

 FROM ubuntu:trusty ... RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \ chown www-data /usr/local/bin/composer && composer --version RUN composer global require sebastian/phpcpd && \ composer global require phpmd/phpmd && \ composer global require squizlabs/php_codesniffer ... 

它的作品,但每次我build立一个图像,我看到关于composer php作为root用户运行恼人的消息,这是不坏的,但我想改变这种行为只是为了好玩:)并学习。

我想创build并保留(用于另一种用法,也可能用于其他任务)用户docker-dev运行此任务。 这个用户应该有一个home目录, composer应该安装全局库,但在这个用户主目录下。

现在composer被安装在/root/.composer下,每个库都安装在那里,我想把它变成/home/docker-dev/.composer ,然后安装在那里的库。

我已经阅读了很多关于这个话题的文档:

  • http://www.projectatomic.io/docs/docker-image-author-guidance/
  • https://github.com/airdock-io/docker-base/wiki/How-Managing-user-in-docker-container
  • http://blog.dscpl.com.au/2015/12/overriding-user-docker-containers-run-as.html
  • 在Docker中以非root用户身份运行应用程序
  • http://www.yegor256.com/2014/08/29/docker-non-root.html
  • 如何在Docker中以非root用户的身份在Docker中运行Docker命令?

还有更多,但这是很多的信息,是混乱。 任何可以帮助我做出这些变化:创build用户和安装composer php库下它的主目录,在我的Dockerfile?

注意:我已经从Dockerfile中删除了不相关的部分,所以post不会太长。

更新

提供的解决scheme之后,我尝试了没有成功:

 # This still running as root because we need to move composer to /user/local/bin RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \ chown www-data /usr/local/bin/composer && composer --version # I am adding a docker-dev user RUN useradd docker-dev # Switch to RUN the next command as the recently created user USER docker-dev # Run the command in verbose mode (just for debug) RUN composer global --verbose require sebastian/phpcpd && \ composer global --verbose require phpmd/phpmd && \ composer global --verbose require squizlabs/php_codesniffer 

这是来自控制台的输出:

 Step 8 : RUN composer global --verbose require sebastian/phpcpd && composer global --verbose require phpmd/phpmd && composer global --verbose require pdepend/pdepend && composer global --verbose require squizlabs/php_codesniffer && composer global --verbose require phpunit/phpunit ---> Running in 0f203e1760a4 [ErrorException] chdir(): No such file or directory (errno 2) Exception trace: () at phar:///usr/local/bin/composer/src/Composer/Command/GlobalCommand.php:74 Composer\Util\ErrorHandler::handle() at n/a:n/a chdir() at phar:///usr/local/bin/composer/src/Composer/Command/GlobalCommand.php:74 Composer\Command\GlobalCommand->run() at phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:847 Symfony\Component\Console\Application->doRunCommand() at phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:192 Symfony\Component\Console\Application->doRun() at phar:///usr/local/bin/composer/src/Composer/Console/Application.php:231 Composer\Console\Application->doRun() at phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:123 Symfony\Component\Console\Application->run() at phar:///usr/local/bin/composer/src/Composer/Console/Application.php:104 Composer\Console\Application->run() at phar:///usr/local/bin/composer/bin/composer:43 require() at /usr/local/bin/composer:24 global <command-name> [<args>]... 

我不确定问题是否是权限,您怎么看?

在您的Dockerfile中 – 使用RUN命令来创build用户:

 RUN useradd userToRunComposer 

然后在创buildDockerfile后使用USER命令。

 USER userToRunComposer RUN curl -sS https://getcomposer.org/instal... RUN composer global require se... 

您也可以通过在容器内创build用户采取不同的方法,然后提交图像:

 docker exec -ti <my container name> /bin/bash userAdd userToRunComposer 

然后执行: docker commit <my container id> <myimagename>来避免每次都创build用户

看到这个问题。