web-dev-qa-db-ja.com

Dockerコンテナー内でホストユーザーとして実行する

私のチームでは、Dockerコンテナを使用して、Webサイトアプリケーションの開発中にローカルでWebサイトアプリケーションを実行しています。

app.pyに依存関係があるrequirements.txtのFlaskアプリで作業していると仮定すると、作業フローはおおよそ次のようになります。

# I am "robin" and I am in the docker group
$ whoami
robin
$ groups
robin docker

# Install dependencies into a docker volume
$ docker run -ti -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local python:3-slim pip install -r requirements.txt
Collecting Flask==0.12.2 (from -r requirements.txt (line 1))
# ... etc.

# Run the app using the same docker volume
$ docker run -ti -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local -e FLASK_APP=app.py -e FLASK_DEBUG=true -p 5000:5000 python:3-slim flask run -h 0.0.0.0
 * Serving Flask app "app"
 * Forcing debug mode on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 251-131-649

これで、アプリケーションを実行するローカルサーバーが作成され、ローカルファイルに変更を加えることができ、サーバーは必要に応じて更新されます。

上記の例では、アプリケーションはrootユーザーとして実行されます。アプリケーションがファイルを作業ディレクトリに書き戻さない限り、これは問題ではありません。そうなれば、rootが所有する作業ディレクトリにファイル(例:cache.sqlitedebug.logなど)ができてしまいます。これにより、チームのユーザーに多くの問題が発生しました。

他のアプリケーションでは、ホストユーザーのUIDとGIDでアプリケーションを実行することでこれを解決しました-例えばDjangoアプリの場合:

$ docker run -ti -u `id -u`:`id -g` -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local -p 8000:8000 python:3-slim ./manage.py runserver

この場合、アプリケーションは、コンテナ内でID 1000を持つnon-existentユーザーとして実行されますが、ホストディレクトリは、最終的にrobinユーザーによって正しく所有されます。これはDjangoで正常に機能します。

ただし、Flaskは、存在しないユーザーとしての実行を拒否します(デバッグモード):

$ docker run -ti -u `id -u`:`id -g` -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local -e FLASK_APP=app.py -e FLASK_DEBUG=true -p 5000:5000 python:3-slim flask run -h 0.0.0.0
 * Serving Flask app "app"
 * Forcing debug mode on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
Traceback (most recent call last):
...
  File "/usr/local/lib/python3.6/getpass.py", line 169, in getuser
    return pwd.getpwuid(os.getuid())[0]
KeyError: 'getpwuid(): uid not found: 1000'

誰かが私ができる方法があるかどうか知っていますか:

  • Flaskが未割り当てのユーザーIDを気にしないようにする、または
  • 実行時にユーザーIDをユーザー名に動的に割り当てるか、または
  • それ以外の場合、Dockerアプリケーションがホストユーザーとしてホスト上にファイルを作成できるようにしますか?

私が今考えることができる唯一の解決策(超ハッキング)は、Dockerイメージの/etc/passwdのアクセス許可をグローバルに書き込み可能に変更し、実行時にそのファイルに新しいUID/GIDペアとユーザー名。

3
Robin Winslow

この答えは StackOverflowに投稿されました by Robert


ホストのpasswdファイルを共有できます:

docker run -ti -v /etc/passwd:/etc/passwd -u `id -u`:`id -g` -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local -p 8000:8000 python:3-slim ./manage.py runserver

または、/etcを使用するのと同じように、/usr/localをボリュームとして使用して、useraddでユーザーを画像に追加します。

docker run -v etcvol:/etc python..... useradd -u `id -u` $USER

id -uと$ USERの両方が、ホストシェルで、dockerがコマンドを受信する前に解決されます)

0
Robin Winslow