Dockerizing NodeJS app: package. json отлично работает локально, но не внутри контейнера - PullRequest
2 голосов
/ 27 февраля 2020

Это package.json моего Node-приложения:

{
    "name": "my-graphql-app",
    "version": "1.0.0",
    "description": "My Node GraphQL APP",
    "private": true,
    "license": "UNLICENSED",
    "scripts": {
        "start": "npm run run:watch",
        "build": "webpack",
        "build:watch": "webpack --watch",
        "run": "node ./dist/app.js",
        "run:watch": "nodemon ./dist/app.js"
    },
    "dependencies": {
        "@babel/core": "^7.8.4",
        "@babel/polyfill": "^7.8.3",
        "@babel/preset-env": "^7.8.4",
        "apollo-server-express": "^2.10.1",
        "babel-loader": "^8.0.6",
        "body-parser": "^1.19.0",
        "cors": "^2.8.5",
        "express": "^4.17.1",
        "graphql": "^14.6.0",
        "mysql2": "^2.1.0",
        "nodemon": "^2.0.2",
        "npm-run-all": "^4.1.5",
        "sequelize": "^5.21.5",
        "webpack-cli": "^3.3.11"
    },
    "devDependencies": {
        "webpack": "^4.41.6",
        "webpack-node-externals": "^1.7.2"
    }
}

Это нормально работает, когда я запускаю npm install и npm start на моей локальной машине (если это имеет значение, я запускаю это на Ма c ОС Каталина 10.15.3). Моя локальная версия узла v11.10.1.

Я схожу с ума, пытаясь заставить то же приложение Node работать внутри контейнера docker. Я предпринял много разных попыток, настроив package.json и Dockerfile, но у меня всегда возникает ошибка установки npm или ошибка импорта.

Я пытаюсь раскрутить контейнеры (я также иметь контейнер MySQL, используя docker-compose up --build.

Это мой Dockerfile:

FROM node:12

EXPOSE 5000

WORKDIR /graphql_api

COPY package.json .
RUN npm install

COPY . /graphql_api

CMD npm start

Это мой docker-compose.yml:

version: '3'
services:
    database:
        image: mysql:5.7
        environment:
            - 'MYSQL_ROOT_PASSWORD=pwd'
            - 'MYSQL_DATABASE=testdb'
            - 'MYSQL_USER=user'
            - 'MYSQL_PASSWORD=pwd'
        volumes:
            - ./db:/docker-entrypoint-initdb.d
        restart: always
        ports:
            - 8006:3306
    graphql_api:
        build: ./graphql_api
        container_name: graphql_api
        restart: always
        volumes:
            - ./graphql_api:/graphql_api
            - /graphql_api/node_modules
        ports:
            - "5000:5000"
        depends_on:
            - database

(Кстати, контейнер MySQL запускается совершенно нормально, и сама база данных правильно инициализируется со всеми таблицами, которые я определил в моем файле init.sql.)

Как только процесс сборки достигает точки RUN npm install, я всегда получаю это предупреждение:

npm WARN deprecated core-js@2.6.11: core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.

Затем я получаю кучу сообщений, подобных этим

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@~2.1.2 (node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_modules/watchpack/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.11: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: abbrev@1.1.1 (node_modules/watchpack/node_modules/fsevents/node_modules/abbrev):
npm WARN enoent SKIPPING OPTIONAL DEPENDENCY: ENOENT: no such file or directory, rename '/graphql_api/node_modules/watchpack/node_modules/fsevents/node_modules/abbrev' -> '/graphql_api/node_modules/watchpack/node_modules/fsevents/node_modules/.abbrev.DELETE'
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: ansi-regex@2.1.1 (node_modules/watchpack/node_modules/fsevents/node_modules/ansi-regex):

(я не копировал их все, потому что там действительно много .)

После них я получаю сообщение

added 785 packages from 486 contributors and audited 8930 packages in 26.85s

, которое заставляет меня думать, что npm install действительно имело некоторый эффект, несмотря на предыдущие сообщения.

Однако, когда процесс сборки достигает CMD npm start, это происходит:

graphql_api    | > my-graphql-app@1.0.0 start /graphql_api
graphql_api    | > npm-run-all --parallel build:watch run:watch
graphql_api    |
graphql_api    | sh: 1: npm-run-all: not found
graphql_api    | npm ERR! code ELIFECYCLE
graphql_api    | npm ERR! syscall spawn
graphql_api    | npm ERR! file sh
graphql_api    | npm ERR! errno ENOENT
graphql_api    | npm ERR! my-graphql-app@1.0.0 start: `npm-run-all --parallel build:watch run:watch`
graphql_api    | npm ERR! spawn ENOENT
graphql_api    | npm ERR!
graphql_api    | npm ERR! Failed at the my-graphql-app@1.0.0 start script.
graphql_api    | npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

У меня есть также пытался построить контейнер, начиная с образа node:11 вместо образа node:12, чтобы соответствовать версии узла, которую я установил локально, но результат тот же.

Я действительно в растерянности здесь: я попытался изменить многие вещи после поиска в Google и просмотра других ответов StackOverflow (например, добавление "private": true в pacakge.json происходит из ответа, который я нашел здесь, на похожий вопрос), но я все еще не могу получить этот контейнер бежать.

Ответы [ 4 ]

2 голосов
/ 10 марта 2020

Согласно вашему сообщению об ошибке, пакет npm -run-all отсутствует. Внутри dockerfile установите этот пакет (глобально) перед строкой «npm install» и попробуйте снова.

Надеюсь, это поможет!

0 голосов
/ 12 марта 2020

Единственный способ - экспортировать /graphql_api/node_modules/.bin/ в PATH. Место может предотвратить эти последствия

0 голосов
/ 11 марта 2020

Если вы выполните команду из ./graphql_api/node_modules/.bin/, тогда npm -run-all будет работать.

Тогда здесь у вас будет две опции.

  1. Вы можете экспортировать /graphql_api/node_modules/.bin/ в переменную окружения PATH в вашем файле Docker следующим образом; ENV PATH="/graphql_api/node_modules/.bin/:${PATH}"
  2. Вы можете установить npm -run-all как глобально , выполнив команду npm i -g npm-run-all.

Пожалуйста, ознакомьтесь с этой конкретной проблемой, созданной мной при поиске вашей проблемы, упомянутой ниже. https://github.com/mysticatea/npm-run-all/issues/96

0 голосов
/ 11 марта 2020

Вы можете попробовать добавить ./node_modules/.bin/ к вашему PATH в файле Docker. Вероятно, именно там, где находится npm -run-all.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...