Github上にある、Docker上のRailsアプリケーションを、ローカルにgit cloneし、コンテナを起動したときに次のようなエラーが発生して、アプリケーションが起動できないときの原因と対処法について解説しています。
原因
原因はWindowsにgit clone
してきたファイルの改行コードがCRLFとなっているため、Docker for Desktopを動かしているWSL2(Linuxディストリビューション)で読み込めないため。
Linux系(Mac含め)の改行コードはLFなので、CRLFからLFに直す必要があります。
改行パターン | コード | 内容 | 主なOS | 正式名称 |
---|---|---|---|---|
LF | \n | カーソルを新しい行に移動する(行を追加する) | Linux系(Mac OS X以降) | Line Feed |
CR | \r | カーソルを左端の位置に戻す(復帰の意味) | 昔のMacOS(v9以前) | Carriage Return |
CRLF | \r\n | 左端にカーソルを戻して改行する | Windows | (CR + LF) |
対象となるファイル
エラーの対象となるファイルはdocker-compose up
などをしたときに、Docker上で読み込む.sh (シェルファイル)です。
docker-compose.ymlやDockerfileで指定してある、.shファイルです。
ファイルの改行パターンの確認方法
改行パターンの確認は、(1)VSCode、(2)odコマンドで簡単にできます。
VSCodeで確認する
VSCodeの右下に改行コードのパターンが書いてあります。
odコマンドを使って確認する
ファイルの改行がどうなっているかを確認するには、od -c コマンドが便利です
od - <ファイルパス>
odコマンドは指定したファイルの中身を、8進数や16進数など指定した形式で表示します。
-cオプションをつけると、バイトを ASCII 文字として表示します。
この時に改行をした場所が、\nとなっていればLF、\r\nとなっていればCRLFです。
(参考)IBM od コマンド
odコマンドの例
例えば、次のような.shファイルの中身を表示してみます。
#!/bin/bash
set -e
# 初期に作成されるPIDを削除する
rm -f /rails-aa/tmp/pids/server.pid
# DockerfileのCMDにセットしたすべての引数を実行する
exec "$@"
↓ od -c entrypoint.sh
$ od -c entrypoint.sh
0000000 # ! / b i n / b a s h \r \n s e t
0000020 - e \r \n \r \n # 345 210 235 346 234 237 343
0000040 201 253 344 275 234 346 210 220 343 201 225 343 202 214 343 202
0000060 213 P I D 343 202 222 345 211 212 351 231 244 343 201 231
0000100 343 202 213 \r \n r m - f / r a i l
0000120 s - a a / t m p / p i d s / s e
0000140 r v e r . p i d \r \n \r \n # D o
0000160 c k e r f i l e 343 201 256 C M D 343 201
0000200 253 343 202 273 343 203 203 343 203 210 343 201 227 343 201 237
0000220 343 201 231 343 201 271 343 201 246 343 201 256 345 274 225 346
0000240 225 260 343 202 222 345 256 237 350 241 214 343 201 231 343 202
0000260 213 \r \n e x e c " $ @ "
0000274
この例の場合、改行は \r\n になっているので CRLFモード です。345などの数値は日本語です。
対処法
対処法は、対象のファイルの改行コードをCRLFからLFに直すだけです。
主な修正方法は次の2つです。
- gitの設定を変更してcloneしなおす
- VSCodeで修正する(ファイル数が少ない場合)
gitの設定を変更してcloneしなおす
一番確実な方法は gitの設定を変更してcloneし直すことです。
コンテナの削除
git cloneする前に、一度作成したコンテナは削除しておきます。同じコンテナが残っていると、そのコンテナをベースに起動することになります。
(もしくは、git clone後に再度ビルドを実行するのでもOK)
docker rm <コンテナ名>
Gitの設定変更
Git for Windows はデフォルトでは、git cloneしたり、checkoutの際に改行コードをLFからCRLFに変換する仕様になっています。
このオプションを変更することで、git cloneやcheckout時もLFのままにすることができます。
git config --global core.autocrlf input
git configのglobalオプションで、core.autocrlfオプションの値を input にします。これで完了です。
なおデフォルトはtrueになっています。
git config の core.autocrlfの設定
設定 | cloneしたとき | commitしたとき |
---|---|---|
true | LF -> CRLF | CRLF -> LF |
input | 変換なし | CRLF -> LF |
false | 変換なし | 変換なし |
(参考)Qiita 気をつけて!Git for Windowsにおける改行コード
VSCodeで修正する
対象のファイル数が少ない場合は、VSCodeを使うのがとても簡単です。
VSCodeで対象のファイルを開いて、右下の「CRLF」をクリックし、「LF」を選択します。
右下の表示が「LF」に切り替われば完了です。
この手順で、.shファイルなど、Dockerでコードを読み込んで処理をする、すべてのファイルのコードをLFに変換します。
odコマンドで確認
変換後のファイルをodコマンドで確認すると、改行箇所が、\r\n から、 \n になっていることがわかります。
$ od -c entrypoint.sh
0000000 # ! / b i n / b a s h \n s e t
0000020 - e \n \n # 345 210 235 346 234 237 343 201 253 344
0000040 275 234 346 210 220 343 201 225 343 202 214 343 202 213 P I
0000060 D 343 202 222 345 211 212 351 231 244 343 201 231 343 202 213
0000100 \n r m - f / r a i l s - a a
0000120 / t m p / p i d s / s e r v e r
0000140 . p i d \n \n # D o c k e r f i
0000160 l e 343 201 256 C M D 343 201 253 343 202 273 343 203
0000200 203 343 203 210 343 201 227 343 201 237 343 201 231 343 201 271
0000220 343 201 246 343 201 256 345 274 225 346 225 260 343 202 222 345
0000240 256 237 350 241 214 343 201 231 343 202 213 \n e x e c
0000260 " $ @ " \n
再ビルドの実行
ファイルの変更が完了したら、再度ビルドを実行します。
docker-compose build
再発防止策
上記で、一時的な対応は完了です。
今後の再発防止するためにやっておくべきことが2つあります。
- git (Git for Windows)のグローバル設定の変更
- VSCodeのデフォルト設定の変更
(1)はmustでやっておいた方がいいです。(2)はVSCodeでCRLFを使うことがほとんどない場合はLFに設定しておくのもありです。
なお、(2)の設定をしておかないと、VSCodeで ctrl + n で新しいファイルを作成したときに、右下の改行方式がCRLFになった状態になります。
(1)でgitの設定をしていれば問題ないのですが、大丈夫なんだっけ??というのを防止できます。
git (Git for Windows)のグローバル設定の変更
Git for Windows はデフォルトでは、git cloneしたり、checkoutの際に改行コードをLFからCRLFに変換する仕様になっています。
このオプションを変更することで、git cloneやcheckout時もLFのままにするように変更しておきます。
git config --global core.autocrlf input
Windowsでgitを使うときの注意点
Windowsでgitを使うときは改行コードの設定を確認しておかないと、git hubで他の人たちと共有したたきにコンテナが起動できないといったエラーが発生します。
先ほどの、git config --global core.autocrlf input
でgit clone
したファイルはLFのままにすることができます。
ですが、Windowsのエディタで作成したファイルにCRLFの改行が入っているものを、Zip化するなど変換できないようにしてgit pushした場合に、CRLFが使われているファイルが混在してしまいます。
Windowsでファイルを作成するときは、自分の使っている改行コードがCRLFなのかLFなのか注意が必要です。
VSCodeのデフォルト設定の変更
VSCodeでデフォルトの改行コードを変更することができます。
ctrl ,
で設定タブを開きます。もしくは、画面左下の歯車アイコンから設定を選択できます。
「eol」で検索すると、「Files:Eol 既定の改行文字。」という項目があるのでこれを \n
にします。
以上で設定は完了です。
ちなみに、eolのデフォルト設定はautoになっています。