Docker 生成 shell 作为用户而不是 root
Docker Spawn a shell as a user instead of 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"
通过将 UID
和 GID
设置到我的主机的用户 ID 和组 ID 并使用以下配置形式 fpm:
[global]
daemonize = no
[www]
listen = 9000
user = developer
group = developer
我设法 运行 对我的代码进行任何更改,而不用担心用户奖励的神秘更改。但是我希望能够以开发人员用户的身份在 运行ning php_dev
容器内生成一个 shell,这样任何未来的工具,例如 composer
或 npm
都将运行 具有适当的用户权限。
当然,我想同样的原则也适用于其他语言,例如 python pip
最后放一行:
USER developer
当您通过以下方式生成 shell 时确实有效:
docker exec -ti /bin/sh
如果您需要 运行 容器作为 non-root 用户,您必须将以下行添加到您的 Dockerfile
:
USER developer
请注意,为了通过 docker-compose.yml
挂载目录,您必须在 运行ning docker-compose up
之前更改该目录的权限,方法是执行以下命令
chown UID:GID /path/to/folder/on/host
UID
和GID
应该匹配用户容器的UID
和GID
。
这将使用户能够毫无问题地读取和写入已安装的卷
详细了解 USER 指令
通常当我使用 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"
通过将 UID
和 GID
设置到我的主机的用户 ID 和组 ID 并使用以下配置形式 fpm:
[global]
daemonize = no
[www]
listen = 9000
user = developer
group = developer
我设法 运行 对我的代码进行任何更改,而不用担心用户奖励的神秘更改。但是我希望能够以开发人员用户的身份在 运行ning php_dev
容器内生成一个 shell,这样任何未来的工具,例如 composer
或 npm
都将运行 具有适当的用户权限。
当然,我想同样的原则也适用于其他语言,例如 python pip
最后放一行:
USER developer
当您通过以下方式生成 shell 时确实有效:
docker exec -ti /bin/sh
如果您需要 运行 容器作为 non-root 用户,您必须将以下行添加到您的 Dockerfile
:
USER developer
请注意,为了通过 docker-compose.yml
挂载目录,您必须在 运行ning docker-compose up
之前更改该目录的权限,方法是执行以下命令
chown UID:GID /path/to/folder/on/host
UID
和GID
应该匹配用户容器的UID
和GID
。
这将使用户能够毫无问题地读取和写入已安装的卷
详细了解 USER 指令