イメージにユーザーを追加し、ルートとしてコンテナを起動し、エントリポイントを使用して、コンテナ内のuid/gidを開発者のボリュームマウントと一致させることができます。その後、コンテナユーザーに切り替えてアプリを実行します。
これを実現するために、私は次の行が含まエントリポイントのシェルスクリプトを使用しました:、そのスクリプトで
OLD_UID=`getent passwd "${opt_u}" | cut -f3 -d:`
NEW_UID=`ls -nd "$1" | cut -f3 -d' '`
if [ "$OLD_UID" != "$NEW_UID" ]; then
usermod -u "$NEW_UID" "$opt_u"
if [ -n "$opt_r" ]; then
find/-mount -uid "$OLD_UID" -exec chown "$opt_u" {} \;
fi
fi
OLD_GID=`getent group "${opt_g}" | cut -f3 -d:`
NEW_GID=`ls -nd "$1" | cut -f4 -d' '`
if [ "$OLD_GID" != "$NEW_GID" ]; then
groupmod -g "$NEW_GID" "$opt_g"
if [ -n "$opt_r" ]; then
find/-mount -gid "$OLD_GID" -exec chgrp "$opt_g" {} \;
fi
fi
を$1
は、ボリュームがマウントパスをされ、opt_u
は、コンテナ内のユーザー名で、opt_g
がありますグループ名、およびopt_r
は、コンテナ内のファイルシステムを再帰的に調整するフラグです。私のエントリポイントの非常に終わり
、私はキックオフ:ユーザー$RUN_AS
に切り替わり、幹部がそのユーザとしてエントリポイントに渡されたコマンドだ、とPID 1としてGosuをするために使用され
exec gosu "${RUN_AS}" "[email protected]"
su
がpid 1として実行されないようにしてください。
これまでのJenkinsと同様の例を、ドッカーソケットのGIDと一致するコンテナ内のアプリケーションとして公開しました。https://github.com/bmitch3020/jenkins-docker
これは、画像を任意の開発者システムに移植可能にする重要な面を持ち、同じコマンドで実行することができます。パーミッションがファイルシステム上でどのようなものであっても、外部からコンテナにマップされるのは、コンテナ内のコマンドを実行しているユーザのuid/gidになります。 docker run
コマンドの開発者システムでローカルuid/gidを検索する必要はなく、独自のuid/gidエントリを持つ各開発者ワークステーションでイメージを構築する必要はありません。この実装の唯一の欠点は、ユーザ/グループとファイルシステムの所有権を変更するためのアクセス権としてrootとしてエントリポイントを実行する必要があるため、docker exec
がrootとしてコンテナに入ることです。
'docker run -u username' –
@TJBiddle' docker:デーモンからのエラー応答:linux spec user:ユーザーを見つけることができませんPASSED_USERNAME:passwdファイル内に一致するエントリがありません。私の質問の第4段落で話していること。 –