はじめに (対象読者・この記事でわかること)
この記事は、Go言語を学び始めたプログラマーや、Goで開発を行っている開発者を対象としています。特にDockerコンテナ内や権限の制限された環境でGo開発を行っている方に役立つ内容です。
この記事を読むことで、go installコマンド実行時に発生する「mkdir /home: read-only file system」というエラーの原因と具体的な解決方法がわかります。また、様々な環境でGo開発をスムーズに進めるための設定方法についても理解できます。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。 - Go言語の基本的な知識 - コマンドラインの基本的な操作 - ファイルシステムの基本的な概念
go install実行時のread-only file systemエラーとは
この記事で扱う問題は、Go言語のパッケージ管理ツールであるgo installコマンドを実行した際に発生する「mkdir /home: read-only file system」というエラーです。このエラーは、主にDockerコンテナ内や権限の制限された環境でGo開発を行う際に遭遇します。
原因は、go installがデフォルトでユーザーのホームディレクトリにGoモジュールをインストールしようとするためです。特にDockerコンテナを使用している場合、コンテナ内のファイルシステムが読み取り専用でマウントされていることが多く、この問題が頻繁に発生します。
この問題を解決するには、いくつかの方法があります。本記事では、原因から具体的な解決策までを詳しく解説します。
read-only file systemエラーの解決策
解決策1: GOBIN環境変数の設定
解決策の一つは、GOBIN環境変数を設定することです。これにより、go installがバイナリをインストールする場所を指定できます。
Bashexport GOBIN=/path/to/writable/directory go install example.com/package
この方法では、書き込み可能なディレクトリを事前に作成し、そのパスをGOBIN環境変数に設定します。これにより、go installは指定されたディレクトリにバイナリをインストールしようとします。
解決策2: GOPATHの設定
GOPATH環境変数を設定して、書き込み可能なディレクトリを指定することも有効です。
Bashexport GOPATH=/path/to/writable/gopath go install example.com/package
GOPATHはGoのワークスペースのルートディレクトリを指定する環境変数です。このディレクトリ内にsrc, pkg, binというサブディレクトリが作成され、それぞれソースコード、パッケージファイル、ビルド済みバイナリが格納されます。
解決策3: ユーザーディレクトリの使用
ユーザーのホームディレクトリが書き込み禁止の場合は、一時的に別のディレクトリを使用する方法があります。
Bashmkdir -p ~/go/bin export GOPATH=~/go export GOBIN=~/go/bin go install example.com/package
この方法では、ユーザーのホームディレクトリ内にgoというディレクトリを作成し、そこをGOPATHとして使用します。ホームディレクトリ自体が書き込み禁止でない場合に有効な方法です。
解決策4: Dockerコンテナ内での対応
Dockerコンテナ内でこの問題が発生する場合、Dockerfileの修正が必要です。
DockerfileFROM golang:1.18 # 書き込み可能なディレクトリを作成 RUN mkdir -p /go/bin && chmod -R 777 /go # 環境変数を設定 ENV GOPATH /go ENV GOBIN /go/bin ENV PATH $PATH:/go/bin # コンテナ内で作業 WORKDIR /app
このDockerfileでは、コンテナ内に書き込み可能なディレクトリを作成し、適切な権限を設定しています。また、GOPATHとGOBIN環境変数を設定し、PATHにGOBINを追加しています。これにより、コンテナ内でgo installコマンドを実行できるようになります。
解決策5: go installのオプションを使用
go installコマンドには、インストール先を指定するオプションがあります。
Bashgo install -ldflags="-s -w" -o /path/to/output/example.com/package
この方法では、-oオプションを使用して出力先を直接指定します。ただし、この方法ではパッケージの依存関係も手動で管理する必要があるため、一般的には前述の環境変数の設定方法が推奨されます。
ハマった点やエラー解決
実際の開発現場では、これらの設定をしてもエラーが解決しない場合があります。その際は、ファイルシステムの権限を確認することが重要です。特にDockerコンテナを使用している場合、ホストマシンとコンテナ間のディレクトリマウント設定を確認してください。
また、.bashrcや.zshrcなどの設定ファイルに環境変数を追加した後は、ターミナルを再起動するか、sourceコマンドで設定を読み込む必要があります。
Bash# 設定ファイルの編例 echo 'export GOPATH=$HOME/go' >> ~/.bashrc echo 'export GOBIN=$GOPATH/bin' >> ~/.bashrc echo 'export PATH=$PATH:$GOBIN' >> ~/.bashrc source ~/.bashrc
さらに、Dockerコンテナを使用している場合は、コンテナの起動オプションでボリュームマウントを正しく設定しているか確認してください。
Bash# 読み取り専用ファイルシステムを回避するためのdocker run例 docker run -it -v /path/to/host:/path/to/container:rw golang:1.18
解決策の選択基準
これらの解決策の中から、どの方法を選ぶかは使用環境によって異なります。
- ローカル開発環境で一時的に解決したい場合:解決策1や3が手軽です
- Dockerコンテナ内で開発を行う場合:解決策4が最も確実です
- 長期的な開発環境を構築したい場合:解決策2や3が適しています
- 特定のディレクトリにバイナリを配置したい場合:解決策5が有効です
開発環境に合わせて最適な方法を選択してください。
まとめ
本記事では、Go言語のgo install実行時に発生するread-only file systemエラーの原因と解決策について解説しました。主な解決策として、GOBINやGOPATH環境変数の設定、書き込み可能なディレクトリの使用、Dockerfileの修正などがあります。これらの方法を適切に使い分けることで、様々な環境でGo開発をスムーズに進めることができます。特にDockerコンテナ内での開発を行う際は、事前に適切な権限設定を行うことが重要です。
参考資料
