Docker以用户而不是root

时间:2018-02-27 21:22:18

标签: docker containers root

通常当我使用docker容器开发应用程序作为我的开发测试基础时,我需要通过以下命令手动运行composer,phpunit,npm,bower和各种开发程序包中的shell:

docker exec -ti /bin/sh

但是当生成shell时,会产生root权限。我想要实现的是生成一个没有root权限但具有指定用户权限的shell。

我怎么能这样做?

在我的情况下,我的Dockerfile包含以下条目:

FROM php:5.6-fpm-alpine

ARG UID="1000"
ARG GID="1000"

COPY ./entrypoint.sh /usr/local/bin/entrypoint.sh
COPY ./fpm.conf /usr/local/etc/php-fpm.d/zz-docker.conf


RUN chmod +x /usr/local/bin/entrypoint.sh &&\
    addgroup -g ${GID} developer &&\
    adduser -D -H -S -s /bin/false -G developer -u ${UID} developer


ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["php-fpm"]

我将我从主机开发的项目的目录安装到/var/www/html并保留用户权限,所以我只需要以下docker-compose.yml来构建它:

version: '2'
services:

 php_dev:
  build:
   context: .
   dockerfile: Dockerfile
   args:
     XDEBUG_HOST: 172.17.0.1
     XDEBUG_PORT: 9021
     UID: 1000
     GID: 1000
  image: pcmagas/php_dev
  links:
    - somedb
  volumes:
    - "$SRC_PATH:/var/www/html:Z"

首先将UIDGID设置为我的主机的用户ID和组ID,然后使用以下配置表单fpm:

[global]
daemonize = no

[www]
listen = 9000
user = developer
group = developer

我设法对我的代码进行任何更改,而不必担心用户的wonerships会发生神秘的变化。但我希望能够以开发者用户的身份在正在运行的php_dev容器中生成一个shell,因此任何未来的工具(如composernpm)都将以适当的用户权限运行。

对于cource我想同样的原则也适用于其他语言以及py pip

的例子

2 个答案:

答案 0 :(得分:2)

如果您需要以非root用户身份运行容器,则必须将以下行添加到Dockerfile

USER developer

请注意,为了通过docker-compose.yml挂载目录,您必须在运行docker-compose up之前通过执行以下命令来更改该目录的权限

chown UID:GID /path/to/folder/on/host

UIDGID应与用户容器的UIDGID匹配。 这将使用户能够在没有任何问题的情况下读取和写入已安装的卷

详细了解USER指令

答案 1 :(得分:0)

最后放线:

USER developer

通过:

生成shell时真的有用
docker exec -ti /bin/sh