概要
Dockerコンテナでホストのファイルをマウントすると、ファイルの権限問題により、エラーが発生することがあります。
本記事では、公式サイトの手順を基にpre-commit-terraform
をDocker環境でセットアップする過程で発生したエラーと、その原因を解説します。また、-e USERID=$(id -u):$(id -g)
を使用してこの問題を解決する方法についても具体的に説明します。
この記事で伝えたいこと
- Dockerでのファイル権限問題の原因を理解する。
pre-commit-terraform
を公式手順に従いDockerでセットアップする際に直面する問題を共有。-e
オプションを活用した権限問題の解決方法を学ぶ。
解決したい課題
Terraformのコードをチェックするために、以下の公式サイトの手順を参考にしてpre-commit-terraform
をDockerでセットアップしました。
公式手順(https://github.com/antonbabenko/pre-commit-terraform)では、以下のようにDockerイメージを利用して`pre-commit`を簡単に実行できるとされています。
TAG=latest
docker run -e "USERID=$(id -u):$(id -g)" \
-v $(pwd):/workspace \
-w /workspace \
ghcr.io/antonbabenko/pre-commit-terraform:$TAG run --all-files
この手順を試みましたが、以下のエラーが発生しました。
An error has occurred: FatalError: git failed. Is it installed, and are you in a Git repository directory?
ホスト環境の.git
ディレクトリをマウントしているにもかかわらず、git
が正しく動作せず、pre-commit-terraform
がリポジトリを認識できていないようでした。
課題の原因
公式手順通りに実行してもエラーが発生した背景には、Dockerコンテナとホスト間のファイル権限の不一致がありました。
原因の詳細
- ホストのファイル権限
.git
ディレクトリを含むホスト側のファイルは、ホストユーザー(例:test
)によって管理されています。このユーザーにはUID(例: 1000)とGID(例: 1000)が割り当てられています。
- Dockerコンテナ内のデフォルト権限
- Dockerコンテナ内では通常
root
(UID:0, GID:0)または別のデフォルトユーザーが動作します。このため、ホストファイルに対する読み書き権限が不足することがあります。
- Dockerコンテナ内では通常
pre-commit
-terraform
の動作要件pre-commit-terraform
はGitリポジトリの情報を使用してフックを実行します。しかし、.git
ディレクトリへのアクセス権限がないため、git failed
エラーが発生しました。
課題を解決する技術、手法
技術、手法の概要
-e
オプションを活用し、ホスト環境のユーザーID(UID)とグループID(GID)をDockerコンテナに渡します。この方法により、コンテナ内のプロセスがホストファイルを正しい権限で操作できるようになります。
修正版コマンド
docker run -e "USERID=$(id -u):$(id -g)" \
-v /usr/local/src/dev/iac/:/workspace \
-w /workspace \
ghcr.io/antonbabenko/pre-commit-terraform:v1.96.2 run --all-files
具体的な作業手順
以下に、公式手順と修正版コマンドを比較しながら具体的な作業手順を説明します。
手順 0: 事前準備
pip install pre-commit
pre-commit --version
TAG=latest
docker pull ghcr.io/antonbabenko/pre-commit-terraform:$TAG
DIR=~/.git-template
git config --global init.templateDir ${DIR}
pre-commit init-templatedir -t pre-commit ${DIR}
git init
cat <<EOF > .pre-commit-config.yaml
repos:
- repo: https://github.com/antonbabenko/pre-commit-terraform
rev: <VERSION> # Get the latest from: https://github.com/antonbabenko/pre-commit-terraform/releases
hooks:
- id: terraform_fmt
- id: terraform_docs
EOF
手順 1: ホストのUIDとGIDを確認
ホスト環境で以下を実行して、自分のUIDとGIDを確認します。
id
例:
uid=1000(test) gid=1000(test)
手順 2: 問題の再現
公式手順をそのまま実行します。
TAG=latest
docker run -v $(pwd):/lint -w /lint ghcr.io/antonbabenko/pre-commit-terraform:$TAG run -a
エラーが発生することを確認します。
手順 3: -e
オプションを使った解決
修正版コマンドを実行します。
docker run -e "USERID=$(id -u):$(id -g)" \
-v $(pwd):/lint \
-w /lint \
ghcr.io/antonbabenko/pre-commit-terraform:v1.96.2 run -a
まとめ
公式手順通りにpre-commit
をDockerでセットアップしようとすると、権限問題によりエラーが発生することがあります。本記事で紹介した-e USERID=$(id -u):$(id -g)
を使用する方法を活用すれば、公式手順をそのまま適用しつつ権限問題を解消できます。この解決策を使い、開発効率を向上させてください。