基本的にDockerコンテナのデフォルトユーザはrootになっているが、ミドルウェアによってはrootのままでは実行できないものも存在していたり、複数ユーザ使いたいケースもある。デフォルトのUbuntuコンテナなどだとsudo
コマンドが利用できなかったり、いろいろあったのでメモとして残しておく。
Ubuntuのカスタムイメージ作成
ベースはubuntu:18.04として、不足しているパッケージをいくつか追加しているのと、日本語が入力できる設定になっています。
FROM ubuntu:18.04
RUN apt-get update -qq \
&& apt-get install -y --no-install-recommends \
sudo curl wget apt-transport-https gnupg \
ca-certificates language-pack-ja \
gcc build-essential git vim
RUN update-locale LANG=ja_JP.UTF-8
ENV LANG="ja_JP.UTF-8" \
LANGUAGE="ja_JP:ja" \
LC_ALL="ja_JP.UTF-8" \
LC_ALL="ja_JP.UTF-8" \
TZ="JST-9" \
TERM="xterm"
ARG username=hoge
ARG wkdir=/home/work
# echo "username:password" | chpasswd
# root password is "root"
RUN echo "root:root" | chpasswd && \
adduser --disabled-password --gecos "" "${username}" && \
echo "${username}:${username}" | chpasswd && \
echo "%${username} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/${username} && \
chmod 0440 /etc/sudoers.d/${username}
WORKDIR ${wkdir}
RUN chown ${username}:${username} ${wkdir}
USER ${username}
CMD ["bash"]
イメージ作成
> docker build -t ubuntu:hoge -f Dockerfile .
> docker run -it --rm ubuntu:hoge /bin/bash
ARG username=hoge
以降で、ユーザを一つ追加しており、このユーザにパスワードなしでsudo
コマンドが実行できるようになってます。/etc/sudoers.d
ディレクトリ以下にユーザ名のファイルを作成して、以下の内容でグループに権限を付与しています(例ではhogeグループ)
あと、とりあえずrootにもパスワードを設定して、su root
でrootユーザへ変更できるようにしています。(セキュリティ的に良くないかもしれないですが、コンテナなのでOKとしてます)
これは、最後にUSER hoge
でhogeユーザがカレントになっているので、rootユーザに変更するときにパスワードが求められるのでそうしています。
> echo "root:root" | chpasswd
%hoge ALL=(ALL) NOPASSWD: ALL
実際にrootユーザでファイルを作成したあとで、hogeユーザに切り替えて最後にsudo rm
でファイルを削除できています。
# カレントユーザがhoge,ディレクトリが/home/workになっている。
# ファイルの追加削除可能
hoge@cbb2cf:/home/work# touch abc
hoge@cbb2cf:/home/work# rm abc
# rootにユーザ変更してファイルを作成
hoge@cbb2cf:/home/work# su root
root@cbb2cf:/home/work# touch xxx
# hogeに戻って、ファイルを削除してみるも、パーミッションでNG
root@cbb2cf:/home/work# exit
hoge@cbb2cf:/home/work# rm xxx
rm: 書き込み保護されたファイル 通常の空ファイル 'xxx' を削除しますか?
# sudoコマンドで無事削除可能
hoge@cbb2cf:/home/work# sudo rm xxx
hoge@cbb2cf:/home/work#