WindowsでDockerを使うときの注意点!改行コードCRLFをLFに変換する方法|エラー対処法:standard_init_linux.go:228: exec user process caused: no such file or directory

docker-prograshi(プロぐらし)-kv Docker
記事内に広告が含まれていることがあります。

Github上にある、Docker上のRailsアプリケーションを、ローカルにgit cloneし、コンテナを起動したときに次のようなエラーが発生して、アプリケーションが起動できないときの原因と対処法について解説しています。

エラー内容

standard_init_linux.go:228: exec user process caused: no such file or directory
<コンテナ名> exited with code 1


原因

原因は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つです。

  1. gitの設定を変更してcloneしなおす
  2. 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したとき
trueLF -> CRLFCRLF -> 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
注意

改行コードを変換したのはローカルのファイルなので、そのファイルをコンテナ内にCOPYする必要があります。そのため再度ビルドします。

再度ビルドしないと、過去に作成したコンテナの中のファイルはCRLFのままなのでエラーが発生します。


再発防止策

上記で、一時的な対応は完了です。

今後の再発防止するためにやっておくべきことが2つあります。

  1. git (Git for Windows)のグローバル設定の変更
  2. 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 inputgit clone したファイルはLFのままにすることができます。

ですが、Windowsのエディタで作成したファイルにCRLFの改行が入っているものを、Zip化するなど変換できないようにしてgit pushした場合に、CRLFが使われているファイルが混在してしまいます。

Windowsでファイルを作成するときは、自分の使っている改行コードがCRLFなのかLFなのか注意が必要です。


VSCodeのデフォルト設定の変更

VSCodeでデフォルトの改行コードを変更することができます。

ctrl , で設定タブを開きます。もしくは、画面左下の歯車アイコンから設定を選択できます。

「eol」で検索すると、「Files:Eol 既定の改行文字。」という項目があるのでこれを \nにします。

以上で設定は完了です。

ちなみに、eolのデフォルト設定はautoになっています。

eolとは?

eolとは、End Of Lineの略で行末を意味します。大文字でEOLと書くかれていることもよくあります。

行末で改行することが多いので、eol = 改行 を意味することもあります。

タイトルとURLをコピーしました