Dockerfile、つまり Docker イメージの ENTRYPOINT として次のスクリプトがあります。
#!/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 "$@"
ほとんどのディストリビューションの GUI と UID は1000
(Fedora と Ubuntu を使用している) 、Linux ではすべて正常に動作しています。Windows - 私は - 私はそれを気にしていないと思いますが、スクリプトは適切に機能し、すべてがうまくいきます。
最初のユーザーの 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 を参照する基本的な機能を提供しないため (関連する問題)、このアプローチでは、各ユーザーが環境変数がホストに存在することを確認する必要があります。~/.bashrc
それを処理するスニペットの例:
export UID
export GID="$(id -g $(whoami))"
最適ではありませんが、現時点では、docker/docker-compose 以外のホスト オーケストレーションがない限り、これ以上の方法はありません。たとえば、コンテナーの開始を処理するシェル スクリプトは、これを簡単にします。別のアプローチは、docker-compose をラップし、コンテナーが開始される前に現在の UID/GID を挿入する gradle などの外部ビルド ツールを使用して、docker-compose.yml をテンプレート化することです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加