我在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
图像。这些图像具有与原始图像相同的重量。我怎么能避免这种情况?Docker对我来说很新,我还在尝试它。 感谢
答案 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镜像。