Site cover image

Site icon imageViserhaut Tech Blog

This blog is a blog that records the daily learning of an infrastructure engineer. It aims to "Viser Haut" or strive for the highest.

Dockerでのpre-commit-terraform実行時に発生する権限問題を解決する方法

概要

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コンテナとホスト間のファイル権限の不一致がありました。

原因の詳細
  1. ホストのファイル権限
    • .gitディレクトリを含むホスト側のファイルは、ホストユーザー(例: test)によって管理されています。このユーザーにはUID(例: 1000)とGID(例: 1000)が割り当てられています。
  2. Dockerコンテナ内のデフォルト権限
    • Dockerコンテナ内では通常root(UID:0, GID:0)または別のデフォルトユーザーが動作します。このため、ホストファイルに対する読み書き権限が不足することがあります。
  3. 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)を使用する方法を活用すれば、公式手順をそのまま適用しつつ権限問題を解消できます。この解決策を使い、開発効率を向上させてください。