Dockerコンテナ内でsudoできるユーザを作成する

基本的に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#