2016-12-19 4 views
4

Я изучаю использование 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 

Почему это не работает в первый раз? Что я сделал не так?

+0

Вы можете попробовать создать изображения отдельно? – Inforedaster

+0

Возможно, вы можете воспитывать меня - какова цель тома/app/node_modules в вашем файле docker-compose.yml? –

+1

Целью тома '/ app/node_modules' является сохранение содержимого в папке node_modules контейнера. Без этого другой том '.:/App' будет скрывать/переопределять папку node_modules. – ronkot

ответ

0

У вас его почти нет. Dockerfile должен ...

# Create the location of our app within the image 
RUN mkdir -p /usr/src/app 
WORKDIR /usr/src/app 

# Copy the package json containing dependencies, then install 
COPY package.json /usr/src/app/ 
RUN npm install 

# Copy the current source to the image 
COPY . /usr/src/app 

# Start the service 
ENTRYPOINT ["npm", "start"] 

У вас есть идея для записи, но Докер изображения берут строительство с нуля.

Смежные вопросы