Это 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
происходит из ответа, который я нашел здесь, на похожий вопрос), но я все еще не могу получить этот контейнер бежать.