Docker Composeで初回起動時のみyarn installを実行させる方法
はじめに
Docker Compose の初回起動時のみ、ライブラリのインストールを実行したい場合があります。
- NodeJS の場合
yarn installやnpm install - PHP の場合
composer install - Ruby on Rails の場合
bundle install
いい方法が無いか考えた末、 docker-compose.yaml の command 属性に工夫して解決させてみました。
検証環境
$ docker-compose --version
docker-compose version 1.29.0, build 07737305Docker Compose 初回起動時にライブラリをインストールしておかないとどうなる?
例えば、以下のような NodeJS の Web アプリケーションを起動させたいと思います。
yarn start というコマンドでサーバが起動します。
version: "3.4"
services:
nodejs:
image: node:15.13.0-alpine
volumes:
- .:/app:cached
working_dir: /app
entrypoint:
- sh
command:
- -c
- |
yarn start
ports:
- 3000:3000entrypoint 、 command の設定情報から、起動時に以下のコマンドが実行されます。
$ sh -c 'yarn start'この設定でアプリケーションを起動してみます。
$ docker-compose upエラーとなってしまいました。
理由は単純で、 node_modules ディレクトリがないため、つまり yarn install コマンドを実行し、ライブラリをインストールしていないためです。
Docker Compose 初回起動前に yarn install しておけばいいが。。。
Docker Compose 起動前に yarn install を実行しておけば、 node_modules ディレクトリにライブラリがインストールされますが、こんなことを考えながらローカル開発環境を構築したく有りません。
初回のみ yarn install が自動的に実行させるようにするにはどうしたら良いでしょう?
Docker Compose 初回起動時のみ yarn install が実行させるようにする
command 属性に 3 行追加し、初回起動時のみ yarn install が実行されるようにしてみました。
version: "3.4"
services:
nodejs:
image: node:15.13.0-alpine
volumes:
- .:/app:cached
working_dir: /app
entrypoint:
- sh
command:
- -c
- |
[ -f ~/.exec-once ] || {
yarn install && touch ~/.exec-once
}
yarn start
ports:
- 3000:3000ロジックを簡単に解説すると以下のようになります。
~/.exec-onceファイルが存在するかをチェック- 存在していなかった場合は以下の処理を実行
yarn installコマンドを実行~/.exec-onceファイルを作成
yarn startコマンドを実行
2 の処理は初回起動時しか実行されません。
yarn install だけではなく、 bundle install 、 composer install にも利用できるはずです。
ひとこと
小細工でしのぎましたが、他のエンジニアの方々はどうやって対処しているのでしょう?
「こんなふうに実装するのがよい」というアドバイスが有れば是非教えて下さい。








ディスカッション
コメント一覧
まだ、コメントがありません