【发布时间】:2017-02-05 08:55:24
【问题描述】:
我将继续学习 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
...
它可以工作,但每次构建图像时,我都会看到关于 composer 以 root 用户身份运行的烦人消息,这一点也不坏,但我想改变这种行为只是为了好玩:) 和学习。
我想创建并保留(用于其他用途,也可能用于其他任务)用户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
- Running app inside Docker as non-root user
- http://www.yegor256.com/2014/08/29/docker-non-root.html
- How to run Docker commands as non-root user in Docker in Docker?
..还有更多,但这是很多信息并且令人困惑。
任何人都可以帮助我在我的 Dockerfile 中创建用户并在其主目录下安装作曲家库吗?
注意:我已经从 Dockerfile 中删除了不相关的部分,所以帖子不会太长。
更新
在提供解决方案之后,这是我尝试过的但没有成功:
# 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>]...
我不确定是不是权限问题,你怎么看?
【问题讨论】:
标签: docker composer-php dockerfile