docker-compose-nodejs个人开发环境

这次准备用docker-compose来搭建基本的node 前端开发环境

基本目录结构

λ ll
total 8
-rwxr-xr-x 1 vincent staff 410B Jul 28 13:47 docker-compose.yml
drwxr-xr-x 21 vincent staff 714B Jul 28 13:47 project
drwxr-xr-x 16 vincent staff 544B Jul 28 13:47 test

docker-compose.yml

version: '3'

services:
web-dev:
build:
context: ./project
dockerfile: Dockerfile.development
ports:
- 8000:8000
volumes:
- ./project:/code
- /code/node_modules
depends_on:
- web-test
web-test:
build:
context: ./test
dockerfile: Dockerfile.development
expose:
- 3000
volumes:
- ./test:/code
- /code/node_modules
  • 基础nodejs服务web-dev,源码放在project下
    web-dev 的dockerfile
    FROM node:6

    ENV HOME=/code
    ENV NPM_CONFIG_LOGLEVEL warn

    COPY package.json $HOME/

    WORKDIR $HOME

    RUN npm install

    COPY . $HOME/

    EXPOSE 8000

    CMD ["npm", "start"]
    这次直接用了node:6这个版本几百MB,对容器内暴露为8000端口
    上面的compose里有把这个8000端口暴露给了本地

volumes:

- ./project:/code
- /code/node_modules

这个配置是把本地的源码mount到容器里面,这样在本地更改源码也会映射到里面,并触发里面的webpack hotreload,这样就能够让开发环境代码更新,node_module这个mount是吧container里面npm install后生成的依赖挂载出来,以免程序中的依赖找不到

  • web-test
    源码放在test目录下
    由于本地开发的时候需要自己做假数据测试,和后端接口开发工作分离,所有我习惯有个测试的node服务,自己写接口来做数据接收和返回.dockerfile和dev一致
    这里对容器内暴露3000端口是因为webpack里的proxy设置

    这里直接用web-test(服务名) 为域名进行访问
    注意这里的host要设置为 ‘0.0.0.0’
    dev中webpack配置

    proxy: {
    '/stereo': 'http://stereo-dev.fenbeijinfu.com',
    '/test': 'http://web-test:3000'
    },
    host:'0.0.0.0', // Defaults to `localhost`
    port:8000 // Defaults to 8080
  • depends_on参数是说 web-dev 这个服务是依赖于web-test,这样就会让web-test先于web-dev启动

兼容问题

这个node基本项目里用了rxjs这个库,但发现用es6的方式引入的部分operator会找不到

// import { Observable } from 'rxjs/Observable'
// import 'rxjs/add/observable/dom/ajax'
// import 'rxjs/add/operator/filter'
// import 'rxjs/add/operator/catch'
// import 'rxjs/add/observable/of'
// import 'rxjs/add/observable/from'
// import 'rxjs/add/observable/forkjoin'
// import 'rxjs/add/operator/map'
// import 'rxjs/add/operator/mergeMap'
// import 'rxjs/add/operator/do'
// import 'rxjs/add/operator/reduce'
import Rx from 'rxjs/Rx';

后来改为这样才能找到,我猜测为linux上某些包,甚至是node和我mac上的不一样导致的,因为不是所有都找不到,例如forkjoin这个就不行

启动整个环境

  1. 这次就不需要一个一个启动了,也不需要在启动的时候注意顺序了
  2. docker-compose up 就可以看到两个容器按预期的顺序启动了,并且8000端口可以看到页面,里面的测试api也能正常访问到测试服务的接口