WindowsとMacで同じDockerfileを扱うなら、改行コードに気をつけよう
はじめに
社内でWindowsユーザーとMacユーザーがいるプロジェクトなんてよくありますよね。
それぞれで環境も異なるので、開発環境の整備には苦労すると思います。
そんな時にはDocker。
Dockerコンテナで構築する分、それぞれの環境に左右されないし、本番環境へもそのまま利用できる。非常に素晴らしい。
でもそんな環境に依存しないDockerでも気をつけなきゃいけない点がありました。(今回の事象以外にも気をつける点はあると思いますが、経験したことのみ取り上げます。)
前提
自身のMacで開発環境用のDockerfileを作成し、他のメンバーにGitHubで共有していました。
Dockerコンテナ環境
OS: AmazonLinux2 Middleware: Apache 2.4 Language: PHP 7.3 Framework: Laravel FrontFramework: Vue.js
ディレクトリ構成
project_root ├── README.md ├── docker_directory │ ├── app │ │ ├── Dockerfile │ │ └── entrypoint.sh │ ├── db │ │ ├── Dockerfile │ │ └── conf.d │ └── docker-compose.yml └── appliation_directory └── src
発生した事象
macOS
# Dockerコンテナ立ち上げる $ docker-compose up # Dockerプロセス確認 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 854b4b49d0c5 laravel "/etc/entrypoint.sh" 6 minutes ago Up 6 minutes 0.0.0.0:8080->80/tcp laravel ee51d4979580 laravel_mariadb "docker-entrypoint.s…" 6 minutes ago Up 6 minutes 0.0.0.0:3306->3306/tcp laravel_mariadb # 問題ないのでリモートリポジトリにpush $ git push origin develop
Macではうまくいきました
windowsOS
# macユーザーがpushしたDocker関連のリポジトリをclone $ git clone # Dockerコンテナ立ち上げる $ docker-compose up # Dockerプロセス確認 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9b9c7a807748 laravel "/etc/entrypoint.sh" 3 minutes ago Restarting (1) 17 seconds ago laravel ff482021b19c laravel_mariadb "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp laravel_mariadb
ん?
なぜかWindows環境ではlaravelコンテナのみ立ち上がらない…
処理を見てると、Dockerfile内の記述は問題なく成功しているようだ
ということは…Dockerfileの末尾に指定してるCMD
コマンドが原因か?
Dockerfileを変更
$ vim Dockerfile # 変更前 ~ CMD ["/etc/entrypoint.sh"] ↓ # 変更後 ~ CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
もう一度試す
# Dockerコンテナ立ち上げる $ docker-compose up # Dockerプロセス確認 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9422f7299f27 laravel "/usr/sbin/httpd -DF…" 22 seconds ago Up 21 seconds 0.0.0.0:8080->80/tcp laravel ee51d4979580 laravel_mariadb "docker-entrypoint.s…" 8 minutes ago Up 8 minutes 0.0.0.0:3306->3306/tcp laravel_mariadb
立ち上がった!
原因
原因は2つありました。
- CMDコマンドの記述をする際、shell scriptを起動するコマンドを省略していた
- windows環境にcloneした際に、改行コードがwindowsのCRLF形式に変わってしまっていた。
解決方法
CMDコマンドの記述
Macではshell scriptを./hoge.sh
のように、記述してもちゃんと起動してくれます。
しかしWindowsでは上手く動かないみたいですね。
ということで以下のように修正
CMD ["/etc/entrypoint.sh"] ↓ CMD ["/bin/bash", "/etc/entrypoint.sh"]
改行コード
.gitattributes
ファイルは、名前の通り対象gitプロジェクトの属性を指定するファイルです。
ここに改行コードを指定しておくことで、どのホストPCにcloneしてきても、改行コードは統一されます。
今回は対象DockerコンテナがAmazonLinux2だったため、Linuxの改行コードであるLF形式
を指定します。
プロジェクトルートに.gitattributes
を追加し、以下を記述
$ vim .gitattributes ~ * text=auto eol=lf :wq
まとめ
調べてみると、本当に初歩的な内容でした。。。
こういった基本的なことをしっかり覚えていき、円滑なプロジェクト運営を行っていきたいと思います。