前提
バージョン
- Docker version 19.03.13, build 4484c46d9d
- docker-compose version 1.27.4, build 40524192
問題
dockerコンテナのビルド中に compose install
や npm ci
を実行すると、
インストール自体は走っているようですが、
CMDのタイミングではなぜか読み込めなくなってしまっています。
vendorやnode_modulesをインストールした状態で、
CMDを動かすようにしたいです。
file
docker-compose.yml
yml
1version: '3' 2volumes: 3 data: # db用 4services: 5 node: # node_modulesインストール用 6 container_name:node 7 build: 8 context: . 9 dockerfile: ./docker/node/Dockerfile 10 tty: true 11 stdin_open: true 12 restart: always 13 volumes: 14 - .:/var/www/html 15 - /var/www/html/node_modules # 永続化 16 app: # メインアプリ 17 container_name: app 18 build: 19 context: . 20 dockerfile: ./docker/php/Dockerfile 21 tty: true 22 stdin_open: true 23 volumes: 24 - .:/var/www/html 25 - /var/www/html/vendor # 永続化 26 volumes_from: 27 - node 28 ports: 29 - "3010:3010" 30 db: # DBコンテナ(略)
docker/node/Dockerfile
Dockerfile
1FROM node:12 2 3ENV PATH $PATH:/node_modules/.bin 4COPY ./package.json . 5COPY ./package-lock.json . 6RUN npm ci --no-cache && npm cache clean --force 7 8WORKDIR /var/www/html 9 10CMD ["npm", "run", "watch"] 11
docker/php/Dockerfile
Dockerfile
1FROM php:7.4-fpm 2 3COPY ./docker/php/files/php.ini /usr/local/etc/php/ 4COPY ./.env /var/www/html/ 5 6RUN apt-get update && apt-get install -y --no-install-recommends \ 7 libfreetype6-dev libzip-dev \ 8 libjpeg62-turbo-dev \ 9 zlib1g-dev mariadb-client procps \ 10 curl gnupg less git vim\ 11 && docker-php-ext-configure gd --with-freetype --with-jpeg \ 12 && docker-php-ext-install -j"$(nproc)" gd zip pdo_mysql \ 13 && apt-get clean \ 14 && rm -rf /var/lib/apt/lists/* 15 16SHELL ["/bin/bash", "-o", "pipefail", "-c"] 17 18# appコンテナ側でもnpm使えるよう念の為 19RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - 20RUN apt-get install -y --no-install-recommends nodejs=12.19.0-1nodesource1 21 22#Composer install 23#hadolint ignore=DL3022 24COPY --from=composer /usr/bin/composer /usr/bin/composer 25 26ENV COMPOSER_ALLOW_SUPERUSER 1 27ENV COMPOSER_HOME /composer 28ENV PATH $PATH:/composer/vendor/bin 29 30COPY composer.json composer.lock ./ 31RN composer install --no-scripts --no-autoloader 32 33WORKDIR /var/www/html 34 35CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=3010"] 36
認識
volumeの適用タイミング
docker-compose.yml
のvolumesでホスト側ディレクトリや仮想volumeを割り当てると、
- ビルドでのRUN時
- volume割当
- CMD、ENTRYPOINT実行
という流れにより、
せっかくビルド時にRUNで compose install
等のインストールを行っても、ホスト側の空vendorディレクトリに2で置き換わってしまう。
そのため、この場合に3で参照しようと思ってもnot foundとなってしまう。
コンテナ内ディレクトリのvolume化
上記のような理由により、コンテナ内でinstall・ファイル生成する場合、
コンテナ内の対象ディレクトリ自体をvolume化し、別コンテナで参照できるように設定する必要がある認識である。
例)
docker
1version: '3' 2volumes: 3 data: # db用 4services: 5 node: # node_modulesインストール用 6 : 7 volumes: 8 : 9 - /var/www/html/node_modules # このディレクトリをvolume化 10 app: # メインアプリ 11 : 12 volumes: 13 : 14 - /var/www/html/vendor # このディレクトリをvolume化 15 volumes_from: 16 - node # nodeコンテナのvolumeを参照 17 :
これで、vendorとnode_modulesがnot foundになることなく参照できる認識である。
のだが、なぜかできないという状況です。
何かわかる方おりましたらよろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。