今日覚えて帰ること
USER <username>
コマンドを実行するユーザーを指定したいときは、
DockerfileでUSER <username>と設定する。
Container Image Footprint User
Run the default Dockerfile
There is a given Dockerfile under
/opt/ks/Dockerfile
.Using Docker:
- Build an image named
base-image
from the Dockerfile.- Run a container named
c1
from that image.- Check under which user the
sleep
process is running inside the container
コンテナビルドして実行してどんなユーザーが存在するか確認せよ、と言っています。
-t でタグ付け(名前付け)してコンテナイメージをビルドします。
docker build -t base-image /opt/ks
次にコンテナのイメージIDを取得します。
そしてc1と名前を付け、そのコンテナを -d(detach) オプションでバックグラウンド実行します。
controlplane $ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
base-image latest 9b2bb5262402 About a minute ago 5.58MB
alpine 3.12.3 389fef711851 3 years ago 5.58MB
controlplane $ docker run --name c1 -d 9b2bb5262402
docker exec <container name>でコンテナを立ち上げます。
すぐ後ろに ps を指定し、当該コンテナが実行するコマンドを指定します。
controlplane $ docker exec c1 ps
PID USER TIME COMMAND
1 root 0:00 sleep 1d
6 root 0:00 ps
controlplane $
当該コンテナはrootユーザーが実行していることが確認できました。
Run container as user
- Modify the Dockerfile
/opt/ks/Dockerfile
to run processes as userappuser
- Update the image
base-image
with your change- Build a new container
c2
from that image
今度は root ユーザーではなく appuser を使用してコンテナ内でプロセスを立ち上がるようにせよ、という問題です。
Dockerfileを修正します。
元のDockerfileは以下のような内容です。
FROM alpine:3.12.3
RUN adduser -D -g '' appuser
CMD sh -c 'sleep 1d'
RUN adduser -D -g '' appuser
を説明します。
RUN adduser
appuser
で新しいユーザーappuser
を作成します。-D
オプションは「デフォルト設定」でユーザーを作成することを意味します。-g ''
オプションは空のユーザーグループを指定します。デフォルトのグループを使用するため、特定のグループ名を指定しません。
こちらを以下のように修正します。
FROM alpine:3.12.3
RUN adduser -D -g '' appuser
USER appuser
CMD sh -c 'sleep 1d'
USER appuser の行は、その行以降のコマンドを指定したユーザーで実行することを宣言しています。
その後のビルドやコンテナ実行の流れは先ほどと同じです。
controlplane $ docker exec c2 ps
PID USER TIME COMMAND
1 appuser 0:00 sleep 1d
6 appuser 0:00 ps
controlplane $
appuserユーザーで実行されていることが確認できました。