kubestronautへの道 ~CKS編 その11 killer coda「Container Image Footprint User」~

tech article

今日覚えて帰ること

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 user appuser
  • 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ユーザーで実行されていることが確認できました。

タイトルとURLをコピーしました