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

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

新規登録して質問してみよう
ただいま回答率
85.50%
docker-compose

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Docker

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

Q&A

解決済

2回答

6167閲覧

Dockerで/usr/bin/env: 'node': No such file or directoryが出る

EbiTT

総合スコア12

docker-compose

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Docker

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

0グッド

0クリップ

投稿2021/03/22 12:29

編集2021/03/23 05:42

前提・実現したいこと

DockerfileでPHP,apache,composer,Node.jsを載せたイメージを作るのが目標です。
Node.jsはSvelte Materialifyのinstallationで紹介されているようにSvelte Materialify というライブラリのインストールにnpmが必要なので入れようとしているだけで,Node.jsを使って何かをしようとしているわけではございません。

発生している問題・エラーメッセージ

「該当のソースコード」のDockerfileを含んだdocker-compose.ymlを使って
docker-compose up -d --buildを実行した結果、このようなエラーが出ました。
これ以外にエラーはありませんでした。

Step 11/11 : RUN npm install && composer install ---> Running in 17260368f27a /usr/bin/env: 'node': No such file or directory ERROR: Service 'web' failed to build : The command '/bin/sh -c npm install && composer install' returned a non-zero code: 127

該当のソースコード

Dockerfile

1FROM node:14.2 as node 2 3FROM php:8.0.2-apache 4 5 6WORKDIR /var/www/html/ 7 8ENV APACHE_DOCROOT /var/www/html/ \ 9 # timezone environment 10 TZ=UTC \ 11 # locale 12 LANG=en_US.UTF-8 \ 13 LANGUAGE=en_US:en \ 14 LC_ALL=en_US.UTF-8 \ 15 # composer environment 16 COMPOSER_ALLOW_SUPERUSER=1 \ 17 COMPOSER_HOME=/composer \ 18 NPM_CONFIG_PREFIX=/home/node/.npm-global \ 19 PATH=$PATH:/home/node/.npm-global/bin 20 21# set package.json for npm install later 22COPY package*.json ./ 23# set composer related files 24COPY composer.* ./ 25# install composer 26COPY --from=composer:2.0.11 /usr/bin/composer /usr/bin/composer 27# node command 28COPY --from=node /usr/local/bin /usr/local/bin 29# npm command 30COPY --from=node /usr/local/lib /usr/local/lib 31# set index.html as a default page 32COPY myhtaccess /usr/local/apache2/ 33 34RUN npm install && \ 35 composer update && \ 36 composer install 37# RUN ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npx 38 39# Codes below should be uncomennted as a production 40# RUN composer install \ 41# && npm install --only=production

試したこと

ローカルマシンに入っているnode系のファイルが悪さをしている可能性を考え、既に
brew uninstall nodebrew
を実行しました。

ディレクトリ構成

イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

brew uninstall nodebrew

DockerはLinuxでしか動作しないので、macOSでは動作しません。
Docker for Macでは、高速低機能なLinuxの仮想マシンを裏側で稼働させて、
そこに向かってファイルやDockerコマンドを流し込んでいるだけの作りになっていますので、

Macのマシン自体にNode.jsやNodebrewがインストールされていようがいまいが何も変わりません。
そのDockerfileは私のマシンでも寸分違わず同じ動作をしてエラーで死ぬでしょう。
Dockerfileさえ正しいものになれば私のマシンでも寸分違わず同じ動作をして期待通りのイメージが出来上がるでしょう。

そこがDockerの採用メリットですからね。

# node command COPY --from=node /usr/local/bin /usr/local/bin # npm command COPY --from=node /usr/local/lib /usr/local/lib

こういうやり方はよくありません。
ディストリビューションによりイメージ内のディレクトリ構成がまちまちだからです。

私の深読みにはなりますが、本当にやりたい事の候補を2通り挙げます。
これにより採用すべき手段が変わります。

  • Node.jsはCSSファイルやJSファイルを生成するのに1回使うだけで、静的ファイルがあればもう要らん
  • ApacheでPHPとNode.jsのWebサーバを同時に起動させたい

前者ならばマルチステージビルドを採用しましょう。
参考記事: Docker multi stage buildで変わるDockerfileの常識 - Qiita

Node.jsのコンテナでCSSやJS等の静的ファイルを作ってしまって、
完成品をPHPのコンテナへ輸送する方法です。

最低限の添削しただけなので動く保証は出来ませんが、
もし求めている方向性が合ってるならこれを参考に進めてみてください。

Dockerfile

1FROM node:14.2 as node 2 3# なんか適当にディレクトリ入って 4WORKDIR /tmp 5 6# package.jsonだけではなく、コンパイルしたい対象のファイルも投げ込んだ方が良いね 7COPY package*.json ./ 8 9RUN npm install && \ 10 npm run build 11 12FROM php:8.0.2-apache 13 14WORKDIR /var/www/html/ 15 16ENV APACHE_DOCROOT /var/www/html/ \ 17 # timezone environment 18 TZ=UTC \ 19 # locale 20 LANG=en_US.UTF-8 \ 21 LANGUAGE=en_US:en \ 22 LC_ALL=en_US.UTF-8 \ 23 # composer environment 24 COMPOSER_ALLOW_SUPERUSER=1 \ 25 COMPOSER_HOME=/composer \ 26 NPM_CONFIG_PREFIX=/home/node/.npm-global \ 27 PATH=$PATH:/home/node/.npm-global/bin 28 29# set composer related files 30COPY composer.* ./ 31# install composer 32COPY --from=composer:2.0.11 /usr/bin/composer /usr/bin/composer 33# set index.html as a default page 34COPY myhtaccess /usr/local/apache2/ 35# 成果物を流し込む 36COPY --from=node /tmp/js /var/www/html/ 37 38RUN composer update && \ 39 composer install

後者が目的ならば
AlpineLinuxにNode.jsを導入する正規の手法でインストールしましょう。
参考記事:

こちらも記事の内容をコピペしただけなので動作保証外ですが、
こんな感じになるでしょう。

Dockerfile

1FROM php:8.0.2-apache 2 3WORKDIR /var/www/html/ 4 5ENV APACHE_DOCROOT /var/www/html/ \ 6 # timezone environment 7 TZ=UTC \ 8 # locale 9 LANG=en_US.UTF-8 \ 10 LANGUAGE=en_US:en \ 11 LC_ALL=en_US.UTF-8 \ 12 # composer environment 13 COMPOSER_ALLOW_SUPERUSER=1 \ 14 COMPOSER_HOME=/composer \ 15 NPM_CONFIG_PREFIX=/home/node/.npm-global \ 16 PATH=$PATH:/home/node/.npm-global/bin 17 18# set package.json for npm install later 19COPY package*.json ./ 20# set composer related files 21COPY composer.* ./ 22# install composer 23COPY --from=composer:2.0.11 /usr/bin/composer /usr/bin/composer 24# set index.html as a default page 25COPY myhtaccess /usr/local/apache2/ 26 27# 特定バージョンのNode.jsをインストールしたければ追加で考える必要はある 28RUN curl -sL https://deb.nodesource.com/setup_lts.x | bash - 29RUN apt install -y nodejs && \ 30 npm install && \ 31 composer update && \ 32 composer install

投稿2021/03/23 03:59

編集2021/03/23 05:12
miyabi-sun

総合スコア21158

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

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

EbiTT

2021/03/23 05:46 編集

丁寧なご回答ありがとうございます! 実はNode.jsを入れようとしているのは下記Svelte-materialifyというライブラリのインストールにnpmを 使う必要があるから、というだけでNode.js自体を使って何かしようとしているわけではございません。 https://svelte-materialify.vercel.app/getting-started/installation/ npmコマンドさえ使えれば良いと言う場合にはどのようにすれば良さそうでしょうか
EbiTT

2021/03/23 05:39

遅ればせながらですが上記を質問に追記させていただきます
miyabi-sun

2021/03/23 05:55

回答読んでください、最初から両対応にしています
EbiTT

2021/03/23 06:41

ご指摘ありがとうございます。お陰様で問題に進展がありました。 前者のDockerfileから進めたところ、composerで再びエラーが吐かれたので一度miyabi-sun様の質問をBAとして本質問をクローズさせて頂き、composerのエラーは別質問とさせて頂きます。
miyabi-sun

2021/03/23 12:24

ナイス!PHPも少しはわかりますが、 PHPを使い続けている専門家には劣るのでそれでお願いします。
guest

0

Dockerfile

1FROM node:14.2-alpine as node 2FROM php:8.0.2-apache

alpineとdebian(だっけ?)で異なるOS同士だと入ってるライブラリとかが違うので単純にコピーしただけでは動かない事もあるような気がします。

例えば下記とかでは動かないですか?(或いはエラーメッセージが変わったりとか。)

Dockerfile

1FROM node:14.2 as node 2FROM php:8.0.2-apache

投稿2021/03/22 14:40

tomomo

総合スコア430

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問