3

node.js アプリケーションを実行する Docker イメージを構築したいと考えています。環境変数を保存するためにdotenv npm パッケージを使用しています。は.envプロジェクトのルートにあります。npm run start_in_dockerホスト マシンからアプリケーション ( ) を起動する npm スクリプトを実行すると、すべてが完全に機能します。ただし、Docker コンテナーを実行すると、次のエラーが発生します。

internal/modules/cjs/loader.js:584
    throw err;
    ^

Error: Cannot find module 'dotenv'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:582:15)
    at Function.Module._load (internal/modules/cjs/loader.js:508:25)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
    at Object.<anonymous> (/usr/src/app/src/server/main.js:3:1)
    at Module._compile (internal/modules/cjs/loader.js:701:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
    at Module.load (internal/modules/cjs/loader.js:600:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
    at Function.Module._load (internal/modules/cjs/loader.js:531:3) 

これは私の Dockerfile です:

FROM node:10-alpine

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN apk add --update python
RUN apk add --update vim
RUN apk add --update sqlite
RUN npm install --only=production

# Bundle app source
COPY . .

EXPOSE 3000

RUN npm install --unsafe-perm=true sqlite3 -g
RUN npm install pm2 -g
# run node-gyp to build sqlite3
RUN cd /usr/src/app/node_modules/sqlite3 && npm run install
WORKDIR /usr/src/app

これは、上記の Dockerfile を実行する私の docker-compose.yml ファイルです。

version: '3'
services:
  appstore-bl-server:
    container_name: appstore-bl-server-production
    build:
      dockerfile: Dockerfile-prod
      context: .
    volumes:
      - ".:/usr/src/app"
    ports:
      - "3000:3000"
    networks:
      - appstore-net
    command: npm run start_in_docker

networks:
  appstore-net:
    driver: bridge

これは私の package.json スクリプト セクションです。

"scripts": {
    "start_in_docker": "NODE_ENV=development DEBUG=server:*,classes:*,middleware,utils node src/server/main.js",
}

これがdotenv私のmain.jsファイルで必要な方法です:

require('dotenv').config();

で絶対パスを指定しようとしまし('dotenv').config()たが、うまくいきませんでした。奇妙なことに、コンテナ シェル ( docker run -it myimage /bin/ash) を実行してから実行すると、npm run start_in_dockerそれも機能します。dotenvもちろん私のpackage.jsonにあります。

4

1 に答える 1

2

これは次のことが原因だと思います。

volumes:
  - ".:/usr/src/app"

docker-compose ファイルに。これにより、現在のディレクトリがアプリ フォルダーにリンクされます。つまり、すべてnode_modulesが置き換えられます。

からボリュームを削除してみて、docker-compose機能するかどうかを確認してください。

実行docker run -it myimage /bin/shすると、ボリュームがリンクされません。つまり、正しい が使用されますnode_modules。これが、それを使用するときに機能する理由です。

于 2019-05-11T15:19:29.357 に答える