背景
Dockerコンテナ内ではデフォルトではrootユーザになる。そのため、コンテナ内に/home/<user名>
以下のフォルダをマウントしてコンテナ内で例えはresult.png
やresult.txt
のようなファイルを生成するとそのファイルの所有者がrootとなり、コンテナ外からのファイルの閲覧や更新、削除にroot権限を求められることがある。
これが度々面倒臭いのでコンテナ内でもホストでの自分と同じユーザーで操作できるようにしたい。
解決方法
ユーザーはuser nameとuser idで識別されているため、コンテナに入った時のデフォルトユーザをホストの自分と同じuser name、user idにすれば良い。
例えは、user nameがhogehogeでuser idが501の時、これらは以下のように確認できる
$ whoami
hogehoge
$ id
uid=501(hogehoge) gid=1000(hogehoge) groups=1000(hogehoge)
通常のDockerfileに以下のように追記する。${UID}
と${USERNAME}
は適宜自分のものに置き換えるか、変数として定義する必要がある。
RUN adduser --disabled-password --gecos "" --uid ${UID} ${USERNAME}
RUN echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
USER ${USERNAME}
このコードの説明を簡潔に書きます。
-
RUN adduser --disabled-password --gecos "" --uid ${UID} ${USERNAME}
新しいユーザーをシステムに追加します。パスワードは設定しません。 -
RUN echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
ユーザーにsudo権限を付与し、パスワード無しで任意のコマンドを実行できるようにします。 -
USER ${USERNAME}
これ以降のコマンドは、${USERNAME} として指定されたユーザーとして実行されます。
以上です。