Dockerコンテナ内での作業ユーザー作成方法
はじめに
こんにちは。株式会社アイデミーのエンジニアの和泉です。普段は、クライアント様のDXを推進するためのアプリケーションやモデルの開発業務に携わっています。
この記事の読者さんは、Dockerを用いて環境を作っていると思いますが、コンテナ内のユーザー管理はどのようにしてますか?
デフォルトのrootユーザーを利用していることも多いと思います。
ホストOSがLinux環境下で、コンテナ内のrootユーザーが作成したファイルは、ホストOSに共有した際に、ホストOS側の所有者もrootユーザーになります。
Linuxの場合、作業ユーザーを用いることが推奨されています。
そこで、今回は、コンテナ内で、rootユーザーを用いず、アプリケーションやコマンドの実行ができるように、コンテナ内に作業ユーザーを作成する方法をお伝えしたいと思います。
記事の概要
筆者が作成したDockerfileを用いて、Dockerコンテナ内に、作業ユーザーを作成する方法を解説します。
ソースコードは、こちらで公開しています。
コンテナ内のユーザー管理の重要ポイント
- 作業ユーザーのユーザーID(UID)とグループID(GID)を、本番環境のホストOSの作業ユーザーと一致させる。
- デフォルトユーザーを、作業ユーザーに変更する。
- 作業用ディレクトリを作成しておき、所有者を作業ユーザーに変更し、デフォルトディレクトリに設定する。
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
ソースコードの内容説明
- 元となるイメージ(今回はnode.jsの公式イメージを利用)を選択
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
rootユーザーでログインしたい場合
rootユーザーでのコマンド実行が必要になった場合、以下のコマンドを利用することで、rootユーザーでログインが可能になります。(例: コマンドインストールの検討)
docker exec -u root -it コンテナID(もしくはコンテナ名) /bin/bash
最後に
Dockerコンテナ内で、作業ユーザーを作成する方法をまとめました。新しいDockerfileを作成する際には、参考にしてもらえればと思います。
なお、Podmanを利用することで、ホストOSのrootユーザーとコンテナ内のrootユーザーを紐付けずに、コンテナを実行することができますので、プロジェクト要件を考慮して検討してみて下さい。
Discussion