我有以下脚本作为我的 Dockerfile 和 Docker 镜像的入口点:
#!/bin/bash
set -e
# Setup permissions
data_dir="/var/www/html"
usermod -u 1000 www-data && groupmod -g 1000 www-data
chown -R www-data:root "$data_dir"
if [ -d "$data_dir" ]; then
chgrp -R www-data "$data_dir"
chmod -R g+w "$data_dir"
find "$data_dir" -type d -exec chmod 2775 {} +
find "$data_dir" -type f -exec chmod ug+rw {} +
fi
# Enable rewrite
a2enmod rewrite expires
# Apache gets grumpy about PID files pre-existing
rm -f /var/run/apache2/apache2.pid
source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND "$@"
对于 Linux,一切都运行良好,因为大多数发行版的 GUI 和 UID 是 1000
(我们使用的是 Fedora 和 Ubuntu)。 Windows - 我认为 - 不关心它,但脚本再次正常工作并且一切顺利。
当我尝试在 Mac (OSX) 中运行它时出现问题,因为第一个用户的 GUI 和 UID 是 500
。这使得权限无法正常工作。
我知道我总是可以将值从 500 更改为 1000,但是......
有什么方法可以从脚本内部获取它,这样这对用户来说是透明的吗?
更新
根据下面的回答,我的脚本是这样的:
#!/bin/bash
set -e
# Setup permissions
data_dir="/var/www/html"
usermod -u ${UID} www-data && groupmod -g ${GUID} www-data
chown -R www-data:root "$data_dir"
if [ -d "$data_dir" ]; then
chgrp -RH www-data "$data_dir"
chmod -R g+w "$data_dir"
find "$data_dir" -type d -exec chmod 2775 {} +
find "$data_dir" -type f -exec chmod ug+rw {} +
fi
# Enable rewrite
a2enmod rewrite expires
# Apache gets grumpy about PID files pre-existing
rm -f /var/run/apache2/apache2.pid
source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND "$@"
如果我没有定义 UID
或 GUID
会发生什么?有什么方法可以依赖默认值作为 1000:1000
(第一个创建的用户)?
最佳答案
最好的办法是将(可选的)环境变量传递给可以由启动脚本处理的 docker 容器。
docker-compose.yml:
version: '2.1'
services:
www:
image: somenginx
environment:
- ${UID}
- ${GID}
然后在您的入口点脚本中使用 $UID/$GID
的值来更新用户的 uid/gid。
遗憾的是 docker-compose 不提供引用当前用户的 UID/GID 的基本能力(相关 issue ),因此这种方法要求每个用户确保主机上存在环境变量。示例 ~/.bashrc
片段可以解决这个问题:
export UID
export GID="$(id -g $(whoami))"
不是很理想,但目前没有更好的方法,除非你有除 docker/docker-compose 之外的其他主机编排。例如,处理容器启动的 shell 脚本将使这变得微不足道。另一种方法是通过一些外部构建工具(如 gradle)对 docker-compose.yml 进行模板化,它包装了 docker-compose 并负责在容器启动之前插入当前的 UID/GID。
关于linux - 从入口点动态选择在主机上运行 Docker 的用户 GUI 和 UID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44026949/