使用docker的简单node.js工作流程

时间:2017-10-24 18:06:47

标签: node.js docker dockerfile

我在Windows上使用Docker进行开发,我正在尝试为node.js项目创建一个简单的工作流程。

我遵循了本教程https://nodejs.org/en/docs/guides/nodejs-docker-webapp/,所以我的Dockerfile看起来像这样

Uri

我的工作流程"对于每个更改将看起来像这样

FIRST BUILD

FROM node:boron

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json .
# For npm@5 or later, copy package-lock.json as well
# COPY package.json package-lock.json ./

RUN npm install

# Bundle app source
COPY . .

EXPOSE 8080
CMD [ "npm", "start" ]

每次更改后

docker build -t thomas/myApp DockerProjects/myApp ; docker run --name app -p 49160:8080 -d thomas/myApp

我不希望在项目每次更改后都有数百个容器,这就是我在创建另一个容器之前删除它的原因。

我看到了几个问题:

  • 每次更改并构建新图像时,都会创建一个新的docker build -t thomas/myApp DockerProjects/myApp ; docker stop app ; docker rm app ; docker run --name app -p 49160:8080 -d thomas/myApp 图像。这些图像具有与原始图像相同的重量。我怎么能避免这种情况?
  • 我可以以某种方式使用nodemon吗?
  • 每次更改代码中的内容时,我都可以自动启动此过程吗?

Docker对我来说很新,我还在尝试它。 感谢

2 个答案:

答案 0 :(得分:2)

您可以在项目中使用nodemon自动重启您的应用,同时将源代码目录安装在卷上。

例如,使用此目录结构(使用package.json中的Grunt来运行nodemon):

app/
├── Dockerfile
├── package.json
├── Gruntfile.js
├── src/
│   └── app.js
└── docker-compose.yml

您可以使用docker-compose这是用于运行多个容器的工具。如果您想要添加应用程序可以与之交谈的数据库容器或与您的应用程序交互的任何其他服务,这将非常有用。

以下docker-compose配置将在容器上的src上挂载/usr/src/app/src文件夹。当nodemon在src内查找更改时,您将能够在您的计算机上进行更改,从而自动重启容器上的应用程序

要使用此功能,您可以:

cd app
docker-compose up

上面的命令用于从dockerfile构建映像并启动docker-compose.yml中定义的容器。

docker-compose.yml

version: '2'

services:
  your-app:
    build: .
    ports:
     - "8080:8080"
    restart: always
    container_name: app_container
    volumes:
     - ./src:/usr/src/app/src
    environment:
     - SERVER_PORT=8080

Dockerfile

FROM node:latest

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json .
COPY Gruntfile.js .

RUN npm install

CMD ["npm","start"]

Gruntfile.js:

var path = require('path');

module.exports = function (grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        concurrent: {
            dev: {
                tasks: ['nodemon'],
                options: {
                    logConcurrentOutput: true
                }
            }
        },
        nodemon: {
            dev: {
                script: 'src/app.js',
                options: {
                    ignore: [
                        'node_modules/**'
                    ],
                    ext: 'js'
                }
            }
        },
        clean: {}
    });
    grunt.loadNpmTasks('grunt-concurrent');
    grunt.loadNpmTasks('grunt-nodemon');
    grunt.registerTask('default', ['concurrent']);
};

package.json:

{
  "name": "your-app",
  "version": "1.0.0",
  "description": "service",
  "scripts": {
    "start": "grunt"
  },
  "author": "someone",
  "license": "MIT",
  "dependencies": {
    "express": "^4.14.0"
  },
  "devDependencies": {
    "grunt": "1.x.x",
    "grunt-cli": "1.x.x",
    "grunt-concurrent": "2.x.x",
    "grunt-nodemon": "0.4.x"
  }
}

示例app.js:

'use strict';

const express = require('express');
const port = process.env.SERVER_PORT;

var app = express();

app.get('/', function(req, res) {
    res.send('Hello World');
});

app.listen(port, function() {
    console.log('listening on port ' + port);
});

要重建图片,您需要执行docker-compose build

答案 1 :(得分:0)

Each time there is a change and a new image is build, a new <none>:<none> image is created. These images have the same weight as the original one. How can I avoid that ?

你做不到。这个:iamge是你以前的图片,被你的新图片所取代。所以只需删除它:docker image prune

Can I use nodemon somehow?

我对此并不熟悉,但看起来它只会重新启动您的服务器,但不会执行npm install

Can I launch this process automatically each time I change something in the code?

我会使用Jenkins并在每次git提交时自动构建新的Docker镜像。