この記事のポイント
Dockerを使ってコンテナで開発環境を作るに当たり、微妙にハマった箇所や情報が見つけにくかったポイントを、自分の備忘録としてまとめています。
想定対象
基本的には個人用の備忘録ですが、なんとなくDockerを使っているけど、細かいポイントが抑えきれていない、という方には参考になる情報もいくつか出てくるんじゃないかと思います。
誤りや説明の不足と思われる箇所がありましたらご指摘お願いします。 m(__)m
前提
% docker -v
Docker version 27.4.0, build bde2b89
作っている環境としては nginx+php-fpm+Laravel+MySQL の、PHPを動かす環境です。
以下、ハマったポイントを順不同に箇条書き
1. volumesのパス
プロジェクトのフォルダ構成はだいぶ省略していますがこんな感じ。
root
┝ php-fpm // PHP関連の設定ファイルが置いてあるフォルダ
│ ┝ php.ini // php設定ファイル
│ └ Dockerfile // php用コンテナのDockerfile
┝ nginx // Webサーバ用の設定ファイルなどがおいてあるフォルダ
│ ┝ default.conf // nginx用設定ファイル
│ └ Dockerfile // nginx用コンテナのDockerfile
┝ src // Laravelのプロジェクトソースが置いてあるフォルダ
│ └ public/ // Laravelのpublicフォルダ
└ docker-compose.yml // docker compose の設定ファイル
docker-compose.yml を使って docker compose
コマンドでビルドをする場合、docker-compose.yml でのvolumesの書き方によって、Dockerfileでのカレントディレクトリの位置が変わる=Dockerfile内で記述する相対パスの書き方が変わる。
Dockerfileではカレントディレクトリの上位フォルダへの参照不可。
表記の通り、例えば php-fpm/Dockerfile 内で各種パスを記述する際、 ../php.ini
のように、rootフォルダ配下にphp.iniが配置されたりしていると、参照することはできない。
このため、通常COPY対象となる設定ファイルなどはDockefileと同じまたはそれより下のフォルダに配置するのが一般的。
COPY ./php.ini /usr/local/etc/php/php.ini
docker-compose.yml でカレントディレクトリを指定する。
しかし、docker-compose.ymlの中で対象コンテナのvolumesを指定する際に
php-fpm:
build:
context: .
dockerfile: ./php-fpm/Dockerfile
のように context
で .
を指定することで、 docker compose
コマンドを実行しているカレントディレクトリを、イメージビルド時のカレントディレクトリとして扱うことができる。
この場合、Dockerfile内のCOPYコマンとの記述としては
COPY /php-fpm/php.ini /usr/local/etc/php/php.ini
のような形で、rootディレクトリが docker compose
コマンドの実行ディレクトリとなる。
この形なら、もしphp.iniがroot直下に配置されている場合でも
COPY /php.ini /usr/local/etc/php/php.ini
のようにコピーすることが可能。
ただし、この場合、Dockerfileの指定が、標準名でおいてあるフォルダ指定では効かなくなる。
通常
php-fpm:
build: ./php-fpm
とだけ指定すれば良いものがエラーになるため、上の例のように Dockefile
とファイル名まで明示的に指定しなければエラーとなる。
自分がやりたいことに合わせた書き方の組み合わせで記述する必要あり。
2. delegate などのオプションを long syntax で書く場合は consisttency
volumes:
- ./src:/var/www/html/:delegated
のように short syntaxで書くことが多いかと思いますが、これを一つ一つ名称を指定する long syntax で書くと
volumes:
- type: bind
source: ./src
target: /var/www/html
consistency: delegated
consistency
というキーワードが意外と探しても見つからなかったので。
3. nginxの環境設定について
dockerとは少しズレますが、nginxの環境設定についてもハマったので記載しておきます。
nginx.conf などで作成するnginxの設定ファイルですが、nginxの公式dockerイメージを使うと、1.9以降から、デフォルトで環境変数への差し替えを行うようになっているとのこと。( 参考記事 )
このとき、ハマったのがファイル名の命名規則です。
コンテナ内の /etc/nginx/templates/
配下に、 *.conf.template
の命名ルールに沿った形でファイルを配置して置かなければ処理対象となりません。
例えば default.template
としていたり、または /etc/nginx/conf.d/default.conf.template
などだと、処理対象とならないため注意が必要です。
ひとまずここまで。
作業続けてポイントになりそうなものが出てきたら、随時更新していきます。