DockerでNode.js用のコンテナを作成しようとしていますが、コンテナの起動が上手くいきません。
要素を最小限にしてもだめでした。
Docker Desktopに何もエラーログが出ないので、原因の特定に難を要しています。
ご意見いただきたく存じます。
project/docker/front/Dockerfile
Dockerfile
1FROM node:17-alpine 2 3WORKDIR /var/www/js
project/docker-compose.yml
yml
1version: "3.8" 2 3services: 4 front: 5 build: 6 context: ./ 7 dockerfile: ./docker/front/Dockerfile 8 restart: always 9 volumes: 10 - ./src:/var/www/:cached 11 working_dir: 12 /var/www/js/ 13 ports: 14 - "3000:3000" 15 16volumes: 17 db-store:
実行コマンド
bash
1docker-compose up -d front
環境情報
Windows10 Home
Docker version 19.03.13, build 4484c46d9d
Docker Desktop 2.5.0.1
WSL2 Ubuntu18.04
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
ベストアンサー
駄目な箇所を箇条書きにしていきます。
- 実行コマンドがない
- srcディレクトリだけがNode.jsのプロジェクトではない
- フロントってなんだよ
1つずつ見ていきましょう。
Dockerは単なる仮想環境ではありません。
「ターミナルの1コマンドのみを確実に実行させる為にディレクトリ構造を整えて動かす仮想環境」です。
なのでその「実行すべき1コマンド」はなんぞや?がとても重要になります。
次に/src
ディレクトリだけを中身として突っ込んでいるのが問題です。
Node.jsのプロジェクトというのはプロジェクトルートにpackage.jsonというプロジェクトの概要を説明するファイルが存在し、
npm install
コマンドを実行すると、package.jsonを読み込んで依存モジュールをダウンロードし、/node_modules
ディレクトリに保管してくれます。
その後、/src
のJavaScriptファイルがrequire("モジュール名")
でモジュールを読み込む事を指定したら
プロジェクトルートにある/node_modules
からJavaScriptファイルを探してきてロードしてくれます。
また1コマンドの方に着目した場合、
package.jsonファイル内にコマンドを登録してnpm run xxx
で呼び出すnpm-scripts
Gulp等のタスクランナーといったプロジェクトを実現する為のファイル群もプロジェクトルートにあるでしょう。
これを使って1コマンドの動作を担保すべきなので、/src
ディレクトリだけが内部にコピーされて実行されるなんて絶対にありえないのです。
この2項目を加味した場合のdocker-compose.ymlファイルは下記のようになってることかと思います。
yaml
1version: "3.8" 2 3services: 4 front: 5 build: 6 context: ./ 7 dockerfile: ./docker/front/Dockerfile 8 restart: always 9 volumes: 10 - .:/var/www/:cached 11 working_dir: 12 /var/www/js/ 13 ports: 14 - "3000:3000" 15 command: "npm start" 16 17volumes: 18 db-store:
まぁ、それでは1ミリも解決しないと思うので最後の項目に行きましょう。
フロントってなんだよ
質問文からは読み取れない項目です。
なのでエスパー回答するので、照らし合わせながらdocker-compose.yml等を作り込んでください。
volumesの
:/var/www/:cached
/var/www
ってなんやねん?
これはApacheを起動させてWebサーバとして稼働させた時にデフォルトのルートディレクトリです。
なので、Apacheで動作してほしいんですよね。
(その他の、例えばNginxなりExpressjsを想定しているかもしれないけど)
前項で散々「実行したい1コマンドが大事なんだよ」と説明しましたが、
ApacheやNginx、MySQLの既製品サーバが前提となっているなら話は別。
最初からそのサーバーソフトウェアを実行する為のコマンドがイメージ内に注入されてるので、新しく何かする必要はありません。
今回説明したのは、それがない実行ファイル&環境だけが入っているNode.jsを指定しているからです。
勘違いしないようにしてくださいね。
DockerfileのFROM node:17-alpine
このイメージ(仮想マシン)にはNode.jsの実行ファイルしか入ってないので、
これにApache入っとるんか?って言われても入ってるわけないですよ。
だから、回答者のわたしが質問文を読み取った感じでゴールを設定すると、
「SASSやPugなどのテンプレート言語で書かれたファイル、Node.jsのしきたりで書かれたJavaScriptファイル
これらを静的なHTML、CSS、JSファイルにコンパイルしてから、Apacheで実行したい!」
となるわけです。
Node.jsとApacheが同居してるイメージなんてなので、一見困ったとなるのですが、
Dockerが考えてないわけないじゃないですか。
ちゃんと「マルチステージビルド」という形で用意されています。
参考記事
このマルチステージを使うと、
一度Node.jsのイメージを起動させてGulpやWebpack等を実行して静的ファイル達にコンパイルして
Node.jsのマシンで出来上がった静的ファイルをApacheだけが入っているイメージにコピー
その後Apacheだけが入っているイメージのみを保存
こういう形でフロントエンドのイメージを作成する事が可能となります。
Apacheで調べたらhttpdという名前だったのでそれを使いますかね。
Dockerfile
1FROM node:17-alpine AS build-env 2ADD . /work 3WORKDIR /work 4RUN gulp build # ここに静的ファイル群を生成する為の実行コマンドを記述する 5 6FROM httpd:2.4-alpine 7COPY --from=build-env /work/dist /usr/local/apache2/htdocs/
一般的にsrc(ソース)、コンパイル前のファイルを指す言葉であり、
生成されたファイルはdist(ディスティネーション)、コンパイル等を行ったあとに生成される成果物を指します。
なのでプロジェクトルートにdistディレクトリをつくって、それをApacheイメージが「個々に保存しろ」と指定したディレクトリにコピーするというDockerfileを作りました。
yaml
1version: "3.8" 2 3services: 4 front: 5 build: 6 context: ./ 7 dockerfile: ./docker/front/Dockerfile 8 restart: always 9 volumes: 10 - ./dist:/usr/local/apache2/htdocs:cached 11 ports: 12 - "3000:3000" 13 14volumes: 15 db-store:
これである程度進むんじゃないですかね。
最後に
dockerfile: ./docker/front/Dockerfile
これ絶対社内に詳しい仕事できるエンジニアいるでしょ。
知らない事を聞けないのはチームである意味がないので、
ある程度勉強するのは良いと思いますが、
実際問題どうするか、最終的な判断はその人に相談してください。
投稿2022/03/30 07:02
編集2022/03/30 07:06総合スコア21391
0
一般的にnode.jsの場合、コンテナが起動したら実行するファイルをdockerfileならCMD [ "node", "app.js" ]
、docker-composeならcommand: node app.js
で指定するはずです。
今回何か実行するファイルを用意していますか?
用意していない場合、コンテナはnode.jsの実行環境が整っているコンテナ(サーバー)なので、起動しても何も起こらないと思います。
投稿2022/03/30 06:54
総合スコア673
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/30 07:40
2022/03/30 11:45
2022/04/14 00:40