作为我的Docker镜像的一部分,我有以下ENTRYPOINT
脚本:
#!/bin/bash
set -e
if [ -z "${UID}" ]; then
uid=1000;
else
uid=${UID};
fi
if [ -z "${GID}" ]; then
gid=1000;
else
gid=${GID};
fi
echo "UID: $uid"
echo "GID: $gid"
data_dir="/var/www/html"
usermod -u "$uid" www-data && groupmod -g "$gid" 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
composer_cache_dir="/var/www/.composer"
mkdir -p "$composer_cache_dir"
chown -R www-data:root "$composer_cache_dir"
if [ -d "$composer_cache_dir" ]; then
chgrp -R www-data "$composer_cache_dir"
chmod -R g+w "$composer_cache_dir"
fi
a2enmod rewrite expires
rm -f /var/run/apache2/apache2.pid
source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND "$@"
图像编译成功。当我尝试通过运行以下命令docker run -it temp bash
来运行容器时,我得到以下输出:
UID: 0
GID: 1000
usermod: UID '0' already exists
Enabling module rewrite.
Enabling module expires.
To activate the new configuration, you need to run:
service apache2 restart
AH00112: Warning: DocumentRoot [/var/www/html/public_html] does not exist
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
为什么我的UID
是0
?我无法在这里找到我的错误,任何帮助都非常受欢迎。
更新:
更改脚本上的这一行:
if [ "$UID" != 0 ]; then
uid=1000;
else
uid=${UID};
fi
仍然要将0
分配给uid
,是因为var名称? (我使用docker build --no-cache -t temp .
重建了图像,因此没有使用缓存)
答案 0 :(得分:5)
因为Bash中的$UID
扩展为shell的当前用户ID,并且它永远不会为空,所以[ -z "${UID}" ]
永远不会成立。因此,如果脚本以root身份运行,您可以设置uid=${UID};
,可能是uid=0
。
然后usermod -u 0 www-data
会抱怨,因为它会尝试将www-data
的UID更改为零,但已经在使用它,并且如果没有{{1}它就不会这样做标志。 (而且你永远不想这样做......)
如果您想测试-o
是否为零,请使用$UID
。或者在Bash中[ "$UID" == 0 ]
。或者[[ $UID == 0 ]]
进行数字比较,而不是重要。
(我不确定在任何情况下将[ "$UID" -eq 0 ]
的uid更改为1000都是个好主意,您必须让www-data
的用户能够更改其uid。但这不是问题。)
击:
usermod
扩展为当前用户的用户标识,在shell启动时初始化。这个变量是只读的。
usermod命令:
UID
用户ID的新数值 除非使用-o选项,否则此值必须是唯一的。该值必须为非负值。