Я изучаю использование Docker в среде разработки в реальном мире, поэтому я создал очень простое приложение «Hello World» в Node.js с Docker.Мне нужно запустить два раза докеры, чтобы не было ошибок
package.json
{
"name": "docker-real-world",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.14.0"
}
}
server.js (точка входа приложения):
var express = require('express');
express()
.get('/', function(req, res) {
res.send('Success');
})
.listen(3000, function(err) {
if (!err) { console.log('Server started') }
});
Dockerfile.dev
FROM mhart/alpine-node:5.6.0
WORKDIR /app
ENV NODE_ENV development
EXPOSE 3000
ADD package.json /app
RUN npm install
докер-compose.yml
version: "2"
services:
web:
build:
dockerfile: Dockerfile.dev
context: .
volumes:
- .:/app
- /app/node_modules
ports:
- 80:3000
command: node server.js
Резюмируя: В package.json добавить выразить как зависимость для создания основного сервера в server.js. В Dockerfile.dev Я определяю изображение, которое мне нужно для этой среды. Обратите внимание, что я скопировал package.json в рабочий каталог /app
, а затем запустил npm install
. Наконец, я определяю свою среду с помощью docker-compose.yml. Довольно основной (из многих источников, чтобы избежать некоторых ошибок, как добавление /app/node_modules
в докеров-Compose томах)
Проблема заключается в том, что запуск docker-compose up
производит следующее сообщение об ошибке:
$ docker-compose up
Building web
Step 1 : FROM mhart/alpine-node:5.6.0
---> cdbaa8672a25
...
...
web_1 | module.js:341
web_1 | throw err;
web_1 | ^
web_1 |
web_1 | Error: Cannot find module 'express'
web_1 | at Function.Module._resolveFilename (module.js:339:15)
web_1 | at Function.Module._load (module.js:290:25)
web_1 | at Module.require (module.js:367:17)
web_1 | at require (internal/module.js:16:19)
web_1 | at Object.<anonymous> (/app/server.js:1:77)
web_1 | at Module._compile (module.js:413:34)
web_1 | at Object.Module._extensions..js (module.js:422:10)
web_1 | at Module.load (module.js:357:32)
web_1 | at Function.Module._load (module.js:314:12)
web_1 | at Function.Module.runMain (module.js:447:10)
dockerrealworld_web_1 exited with code 1
И затем повторно запущенного ту же команду (без изменения какого-либо кода), он работает:
$ docker-compose up
Starting dockerrealworld_web_1
Attaching to dockerrealworld_web_1
web_1 | Server started
Почему это не работает в первый раз? Что я сделал не так?
Вы можете попробовать создать изображения отдельно? – Inforedaster
Возможно, вы можете воспитывать меня - какова цель тома/app/node_modules в вашем файле docker-compose.yml? –
Целью тома '/ app/node_modules' является сохранение содержимого в папке node_modules контейнера. Без этого другой том '.:/App' будет скрывать/переопределять папку node_modules. – ronkot