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

标签 linux macos docker permissions

我有以下脚本作为我的 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 "$@"

如果我没有定义 UIDGUID 会发生什么?有什么方法可以依赖默认值作为 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/

相关文章:

linux - 使用 Apache 将主机名重定向到特定路径

macos - 根据其内容调整控制

linux - bash:从给定子目录名称的当前目录获取路径

azure - Azure 中的 Docker-compose - DNS 不起作用

c++ - 在 Ubuntu Linux 上使用 Kinect 编程

自定义 GtkComboBoxText 的完成

python - 使用 pip 安装笔记本时出错

linux - 在 Mac 和 Linux 中将 Mendeley 库与 Dropbox 同步

postgresql - Docker(组成): making knex work with postgres

docker - 我如何看待Docker缓存的内容