我有以下脚本作为我的 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,但是......
有没有什么方法可以从脚本内部获取它,以便这对用户来说是透明的?
UPDATE
根据下面的答案,这就是我的脚本的样子:
#!/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
or 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 https://github.com/docker/compose/issues/2380),所以这种方式需要每个用户确保主机上存在环境变量。例子~/.bashrc
可以解决这个问题的片段:
export UID
export GID="$(id -g $(whoami))"
不太理想,但目前没有更好的方法,除非除了 docker/docker-compose 之外还有其他主机编排。例如,处理容器启动的 shell 脚本将使这变得微不足道。另一种方法是通过一些外部构建工具(例如 gradle)对 docker-compose.yml 进行模板化,该工具包装 docker-compose 并负责在容器启动之前插入当前的 UID/GID。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)