このページ内での表記:「ホストOSの対話環境」は背景色を黄色(lightyellow)で表す。「Conainer 内の root 権限の対話環境」は背景色を水色(azure)であらわす。「Conainer 内の一般ユーザ権限の対話環境」は背景色を赤色(#ffeeee)であらわす。「他のPCの対話環境」は紫色(#eeeeff)で表す。
$ mkdir -p ~/doc/docker/ubuntu24_user2 $ cd ~/doc/docker/ubuntu24_user2
| 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 []
|
| 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
|
$ docker build -t ubuntu24_user2 . ... 成功
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu24_user2 latest d97f7a47c908 33 minutes ago 81.4MB ...
コンテナに永続的なファイルシステムを提供するために、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
Image ubuntu24_user2 のデフォルトのユーザ情報を用いて、新しい Container ubuntu24-guest2 を生成する。
$ docker run --name ubuntu24-guest2 \
-v /home/docker/guest2:/mnt/hostos \
-it ubuntu24_user2
起動オプション
| マウントポイント | |
|---|---|
| ホストOS | ゲストOS |
| /home/docker/guest | /mnt/hostos |
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) が動く
$ passwd guestNew password: ← 新しいパスワード を入力する。 Retype new password: ← もう一度新しいパスワード を入力する。 passwd: password updated successfully
# whoami root ← root権限で動作している # pwd / ← カレントディレクトリは '/' # ls -ld /mnt/hostos drwxr-xr-x 2 root root 4096 May 6 09:29 /mnt/hostos ← ホストOSをマウントしたディレクトリ
# 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
# 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
ここで^C (Control-C) などを入力して Container の対話環境を終了すると Container 自体の実行が終了してしまうので注意。
# ^P ^Q ← 'Control-P' + 'Control-Q' で Container を detatch する。$ ← ホストOSの対話環境に戻る