1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dockerfile、docker-compose.ymlを作るときの備忘録

Last updated at Posted at 2025-02-03

この記事のポイント

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 などだと、処理対象とならないため注意が必要です。


ひとまずここまで。
作業続けてポイントになりそうなものが出てきたら、随時更新していきます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?