从入口点动态选择在主机上运行 Docker 的用户 GUI 和 UID

2024-01-29

我有以下脚本作为我的 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(使用前将#替换为@)

从入口点动态选择在主机上运行 Docker 的用户 GUI 和 UID 的相关文章

随机推荐