2025/12/24 Updated by

Docker Image を自作する (1b)

Ubuntu 24.04LTS + ユーザ作成


[Up] Japanese English
このページ内での表記:
「ホストOSの対話環境」は背景色を黄色(lightyellow)で表す。
「Conainer 内の root 権限の対話環境」は背景色を水色(azure)であらわす。
「Conainer 内の一般ユーザ権限の対話環境」は背景色を赤色(#ffeeee)であらわす。
「他のPCの対話環境」は紫色(#eeeeff)で表す。

ubuntu24.04LTS をベースとし、ユーザを作成する

方針

作成手順

  1. 作業用フォルダを作成する。
  2.   $ mkdir -p ~/doc/docker/ubuntu24_user2
      $ cd ~/doc/docker/ubuntu24_user2
    
  3. 作業用フォルダの中に Dockerfile を作成する。
  4. Dockerfile
    # ゲストOS: Ubuntu 24.04 LTS
    
    FROM ubuntu:24.04
    
    
    # Change Your Own UNAME, UID, GID, PASS
    
    ENV UNAME=guest
    ENV UID=1000
    ENV GID=1000
    ENV PASS=password
    
    # 必要なパッケージのインストール
    
    RUN apt-get update && \
        DEBIAN_FRONTEND=noninteractive apt-get install -y \
        sudo \
        bash \
        && rm -rf /var/lib/apt/lists/*
    
    
    # Copy Shell Script "entrypoint.sh"
    
    COPY entrypoint.sh /entrypoint.sh
    RUN chmod +x /entrypoint.sh
    
    ENTRYPOINT ["/entrypoint.sh"]
    
    CMD []
    
  5. 作業用フォルダの中に entrypoint.sh を作成する。
  6. entrypoint.sh
    #!/bin/bash
    set -e
    
    if [ ! -f /var/app/.initialized ]; then
        ######## First Time ########
    
        echo "First run. Setting up ..."
        mkdir -p /var/app
        touch /var/app/.initialized
    
        if ! getent passwd "$UNAME" &>/dev/null; then    # 同じユーザ名のユーザが存在しなければ
    
            UNAME_TARGET="$(getent passwd "$UID" | cut -d: -f1 || true)"    # 同じ UID のユーザがいるか調べる
    
            if [ -n "${UNAME_TARGET}" ]; then    # 既存のユーザのユーザ名を変更する
    
    	    echo "Renaming user ${UNAME_TARGET} to $UNAME UID=${UID}"
    	    
    	    usermod -l "$UNAME" "$UNAME_TARGET"    #ユーザ名を変更する
    	    groupmod -n "$UNAME" "$UNAME_TARGET"    # グループ名を変更する (GIDは既存の値のまま)
    	    usermod -d "/home/$UNAME" -m "$UNAME"    # ホームディレクトリ名を変更する
    	    if [ -d "/home/$UNAME_TARGET" ] && [ ! -d "/home/$UNAME" ]; then
    	        mv "/home/$UNAME_TARGET" "$/home/$UNAME"
    	    fi
    
            else    # 新規ユーザを作成する
    
    	    echo "Creating user ${UNAME} with UID=${UID}, GID=${GID}"
    	    
    	    if ! getent group "${UNAME}" &>/dev/null; then    # 同名グループが無ければ作成
                    echo "Creating group ${UNAME} with GID=${GID}"
                    groupadd -g ${GID} ${UNAME}
    	    fi
    	    useradd -m -u ${UID} -g ${GID} -s /bin/bash ${UNAME}    # 新規ユーザを作成する
    	    echo "${UNAME}:${PASS}" | chpasswd    # パスワードを設定する
                usermod -aG sudo ${UNAME}       # sudo グループに加える
    	fi
    
    
        fi
    
        # ホームディレクトリの Owner が root:root になることがあるので明示的に変更する。
        chown -v ${UNAME}:${UNAME}  /home/${UNAME}
    
    else
        ######## Second Time or Later ########
        
        echo "Starting for the second time or later ..."
    
    fi
    
    
    # Execute Commands in CMD
    
    if [ "$#" -gt 0 ]; then
        exec "$@"
    else
        echo "No command provided. Starting bash ..."
        exec bash
    fi
    
  7. Image を build する。
  8.   $ docker build -t ubuntu24_user2 .
      ...
    成功
    
  9. 生成した Image を確認する
  10. $ docker image ls
    REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
    ubuntu24_user2   latest    d97f7a47c908   33 minutes ago   81.4MB
    ...
    

Container 用の永続的なファイルシステムを作成する

コンテナに永続的なファイルシステムを提供するために、1777 のパーミッションでフォルダを作っておく。 skicky bit が on (1777) のフォルダには、 「誰でもファイルを作成できるが、作成した本人だけがファイルを変更したり消したりできる」 という特徴がある。

$ sudo mkdir -p /home/docker         ← ディレクトリを作成する
$ sudo chmod 1777 /home/docker       ← 誰でもファイルを作成できるが、作成した本人にしか消去できないモードに設定する
$ ls -ld /home/docker                ← ディレクトリのsticky bit が on になっていることを確認する。
drwxrwxrwt 3 root root 4096  5月 06 17:57 /home/docker

Docker Contaner を生成する

Image ubuntu24_user2 のデフォルトのユーザ情報を用いて、新しい Container ubuntu24-guest2 を生成する。

  1. Image から Container を生成して起動する。ユーザ情報はデフォルト値 (guest) を利用する。 Container のファイルシステム内にホストOSのディレクトリをマウントする。
  2. $ docker run --name ubuntu24-guest2 \
        -v /home/docker/guest2:/mnt/hostos \
        -it ubuntu24_user2
    
    起動オプション
  3. Container を起動した対話環境が、そのまま Container 内で動作する bash との対話環境になる。root権限でloginした状態である。
  4. First run. Setting up ...                                                 ←(Conainer内の対話環境)
    Renaming user ubuntu to guest UID=1000
    ownership of '/home/guest' retained as guest:guest
    No command provided. Starting bash ...
    #              ← Container 内の対話環境 (root権限の bash) が動く
    
  5. (重要) (Container 内で) 直ちに新規ユーザ guest のパスワードを変更する。
  6. $ passwd guest   
    New password:                   ← 新しいパスワード を入力する。
    Retype new password:            ← もう一度新しいパスワード を入力する。
    passwd: password updated successfully
    
  7. (Container 内で) Container 内の対話環境を調べる。
  8. # whoami
    root                                       ← root権限で動作している
    # pwd
    /                                          ← カレントディレクトリは '/'
    # ls -ld /mnt/hostos
    drwxr-xr-x 2 root root 4096 May  6 09:29 /mnt/hostos         ← ホストOSをマウントしたディレクトリ
    
  9. (Container 内で) Container の状況を調べる。
  10. # ls -ld /home/guest
    drwxr-x--- 2 guest guest 4096 May  6 14:06 /home/guest
    # ls -la /home/guest
    total 20
    drwxr-x--- 2 guest guest 4096 May  6 14:06 .
    drwxr-xr-x 1 root  root  4096 May  6 14:06 ..
    -rw-r--r-- 1 guest guest  220 Mar 31  2024 .bash_logout
    -rw-r--r-- 1 guest guest 3771 Mar 31  2024 .bashrc
    -rw-r--r-- 1 guest guest  807 Mar 31  2024 .profile
    
  11. (Container 内で) Container 内に作成したユーザの状況を調べる。
  12. # grep guest /etc/group
    adm:x:4:guest
    dialout:x:20:guest
    cdrom:x:24:guest
    floppy:x:25:guest
    sudo:x:27:guest                         ← sudo グループにも追加されている
    audio:x:29:guest
    dip:x:30:guest
    video:x:44:guest
    plugdev:x:46:guest
    guest:x:1000:                           ← グループID
    # grep guest /etc/passwd
    guest:x:1000:1000:Ubuntu:/home/guest:/bin/bash          ← ユーザIDなど
    # usermod -c "Guest" guest       ←  GCOS フィールドを変更する
    # grep guest /etc/passwd
    guest:x:1000:1000:Guest:/home/guest:/bin/bash
    
    # ls -ld /home/guest
    drwxr-x--- 2 guest guest 4096 May  6 14:06 /home/guest         ← ホームディレクトリのパーミッション
    # ls -la /home/guest
    total 20
    drwxr-x--- 2 guest guest 4096 May  6 14:06 .
    drwxr-xr-x 1 root  root  4096 May  6 14:06 ..
    -rw-r--r-- 1 guest guest  220 Mar 31  2024 .bash_logout         ← ホームディレクトリに自動で追加されたファイル群
    -rw-r--r-- 1 guest guest 3771 Mar 31  2024 .bashrc
    -rw-r--r-- 1 guest guest  807 Mar 31  2024 .profile
    
  13. (Container 内で) Control-P + Control-Q を入することで、Container 内の対話環境から抜けて、ホストOSの対話環境に戻る。
  14. ここで^C (Control-C) などを入力して Container の対話環境を終了すると Container 自体の実行が終了してしまうので注意。

    # ^P ^Q ← 'Control-P' + 'Control-Q' で Container を detatch する。
    $ ← ホストOSの対話環境に戻る