daiphone’s blog

AWS / JavaScript / Docker / PHP / Python を中心とした技術ネタと、趣味少々

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

まとめ

調べてみると、本当に初歩的な内容でした。。。

こういった基本的なことをしっかり覚えていき、円滑なプロジェクト運営を行っていきたいと思います。