💬

Dockerコンテナ内での作業ユーザー作成方法

2023/08/16に公開

はじめに

こんにちは。株式会社アイデミーのエンジニアの和泉です。普段は、クライアント様のDXを推進するためのアプリケーションやモデルの開発業務に携わっています。
この記事の読者さんは、Dockerを用いて環境を作っていると思いますが、コンテナ内のユーザー管理はどのようにしてますか?
デフォルトのrootユーザーを利用していることも多いと思います。
ホストOSがLinux環境下で、コンテナ内のrootユーザーが作成したファイルは、ホストOSに共有した際に、ホストOS側の所有者もrootユーザーになります。
Linuxの場合、作業ユーザーを用いることが推奨されています。
そこで、今回は、コンテナ内で、rootユーザーを用いず、アプリケーションやコマンドの実行ができるように、コンテナ内に作業ユーザーを作成する方法をお伝えしたいと思います。

記事の概要

筆者が作成したDockerfileを用いて、Dockerコンテナ内に、作業ユーザーを作成する方法を解説します。
ソースコードは、こちらで公開しています。

コンテナ内のユーザー管理の重要ポイント

  1. 作業ユーザーのユーザーID(UID)とグループID(GID)を、本番環境のホストOSの作業ユーザーと一致させる。
  2. デフォルトユーザーを、作業ユーザーに変更する。
  3. 作業用ディレクトリを作成しておき、所有者を作業ユーザーに変更し、デフォルトディレクトリに設定する。

1.は、ホストOSの作業ユーザーとUIDやGIDを一緒にしておくことで、パーミッションエラーを防ぐことができます。
2.は、コンテナ内のデフォルトユーザーを、作業ユーザーに変更することにより、rootユーザーによるコマンド実行を防ぐことができます。
3.は、専用の作業ディレクトリを作成することで、アプリケーションのファイルとOSを動かすためのファイルを分けることができます。

Dockerfileについて

ソースコード

FROM node:lts-buster

RUN apt-get update && \
    apt-get install vim -y && \
    npm install -g npm@9.8.1 && \
    groupadd -g 1100 app_user && \
    useradd -m -s /bin/bash -u 1100 -g 1100 app_user

RUN mkdir -p /opt/app && chown -R app_user:app_user /opt/app
WORKDIR /opt/app

USER app_user

CMD cd /opt/app && npm start

ソースコードの内容説明

  1. 元となるイメージ(今回はnode.jsの公式イメージを利用)を選択
FROM node:lts-buster
  1. パッケージマネージャーのアップデート、必要なソフトウェアのインストール、作業ユーザーが所属するグループおよび作業ユーザーを作成
RUN apt-get update && \
    apt-get install vim -y && \
    npm install -g npm@9.8.1 && \
    groupadd -g 1100 app_user && \
    useradd -m -s /bin/bash -u 1100 -g 1100 app_user
  1. 作業するディレクトリの作成および所有者を作業ユーザーに変更
RUN mkdir -p /opt/app && chown -R app_user:app_user /opt/app
  1. デフォルトのディレクトリを、作業ディレクトリに変更
WORKDIR /opt/app
  1. デフォルトユーザーを、作業ユーザーに変更
USER app_user

rootユーザーでログインしたい場合

rootユーザーでのコマンド実行が必要になった場合、以下のコマンドを利用することで、rootユーザーでログインが可能になります。(例: コマンドインストールの検討)

docker exec -u root -it コンテナID(もしくはコンテナ名) /bin/bash

最後に

Dockerコンテナ内で、作業ユーザーを作成する方法をまとめました。新しいDockerfileを作成する際には、参考にしてもらえればと思います。
なお、Podmanを利用することで、ホストOSのrootユーザーとコンテナ内のrootユーザーを紐付けずに、コンテナを実行することができますので、プロジェクト要件を考慮して検討してみて下さい。

Aidemy Tech Blog

Discussion