質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
npm

npmは、Node Packaged Modulesの略。Node.jsのライブラリ・パッケージを管理できるツールです。様々なモジュールを簡単にインストールでき、自分でモジュールを作成し公開する際にも使用できます。

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

composer

Composerとは、PHP5.3.2以上で使用可能なパッケージ管理ツールです。指定ディレクトリ内だけでパッケージ管理します。

Q&A

1回答

1645閲覧

dockerビルド中にvendorやnode_modulesをインストールしたい

tashua314

総合スコア145

npm

npmは、Node Packaged Modulesの略。Node.jsのライブラリ・パッケージを管理できるツールです。様々なモジュールを簡単にインストールでき、自分でモジュールを作成し公開する際にも使用できます。

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

composer

Composerとは、PHP5.3.2以上で使用可能なパッケージ管理ツールです。指定ディレクトリ内だけでパッケージ管理します。

0グッド

0クリップ

投稿2020/11/10 09:53

編集2020/11/10 09:55

前提

バージョン

  • Docker version 19.03.13, build 4484c46d9d
  • docker-compose version 1.27.4, build 40524192

問題

dockerコンテナのビルド中に compose installnpm 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を割り当てると、

  1. ビルドでのRUN時
  2. volume割当
  3. 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になることなく参照できる認識である。
のだが、なぜかできないという状況です。

何かわかる方おりましたらよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

version: '3'

Docker Compore の仕様で、ご質問で記述された内容はバージョン2相当であれば妥当と思いますが、バージョン3では動作していないか、意図せぬ動作になっている可能性が高いです。

バージョン3のリファレンスにありますように、 volumes: として、どちらのサービスからも参照可能なボリュームを作成されてみてはいかがでしょう。

投稿2021/04/10 05:50

zembutsu

総合スコア1584

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問