【问题标题】:Run docker as non-root in a development environment for an specific process在特定进程的开发环境中以非 root 身份运行 docker
【发布时间】: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,然后在那里安装库。

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

..还有更多,但这是很多信息并且令人困惑。

任何人都可以帮助我在我的 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


    【解决方案1】:

    在您的 Dockerfile 中 - 使用 RUN 命令创建用户:

    RUN useradd userToRunComposer
    

    然后在你的 Dockerfile 中使用USER 命令,在创建它之后。

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

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

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

    然后执行:docker commit &lt;my container id&gt; &lt;myimagename&gt; 以避免每次都创建用户

    this question.

    【讨论】:

    • 我相信RUN useradd userToRunComposer会创建如下目录/home/userToRunComposer,对吗?如果是这样,这个用户只会为作曲家任务而活,还是会保留在最终图像上?下载到 /home/userToRunComposer 的内容会怎样?
    • 查看 OP 上的更新,我已添加有关您建议的更改的输出
    • 保存/创建到非卷挂载目录的内容将保留在映像中
    • 我认为新用户不知道 composer 可执行文件,您可以将其添加到路径中吗?还是 /usr/local/bin 在路径中?
    • 不确定如何在容器中实现这一点,但只是为了拍摄,这是否可行:RUN export PATH=$PATH:/usr/local/bin?
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多