eggjs + docker 最佳实践

Created on 16 Sep 2017  ·  27Comments  ·  Source: eggjs/egg

docker该如何配合eggjs work特性让项目稳定的运行?

Most helpful comment

#package.json

{
  "scripts": {
    "start": "egg-scripts start",
  }
}

Dockerfile

FROM node:8.6.0-alpine

RUN apk --update add tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && apk del tzdata

RUN mkdir -p /usr/src/app

WORKDIR /usr/src/app

# add npm package
COPY package.json /usr/src/app/package.json

RUN npm i --registry=https://registry.npm.taobao.org

# copy code
COPY . /usr/src/app

EXPOSE 7001

CMD npm start

8.0.0 egg-socket-io sticky 会有问题,如果没特殊要求换高版本吧

All 27 comments

就在 docker 里面跑 egg-scripts start 即可,不需要 --daemon 了。

#package.json

{
  "scripts": {
    "start": "egg-scripts start",
  }
}

Dockerfile

FROM node:8.6.0-alpine

RUN apk --update add tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && apk del tzdata

RUN mkdir -p /usr/src/app

WORKDIR /usr/src/app

# add npm package
COPY package.json /usr/src/app/package.json

RUN npm i --registry=https://registry.npm.taobao.org

# copy code
COPY . /usr/src/app

EXPOSE 7001

CMD npm start

8.0.0 egg-socket-io sticky 会有问题,如果没特殊要求换高版本吧

提前COPY package.json && npm install ,docker构建镜像,加快速度
另:用yarn替代npm可以加快镜像构建,大概平均节省30s

你用我们的 https://github.com/cnpm/npminstall 一样会快的发溜。

发自我的 iPhone

在 2017年9月17日,10:04,Quinton.Xu notifications@github.com 写道:

用yarn替代npm可以加快镜像构建,大概平均节省30s


You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or mute the thread.

tips

  • RUN/COPY 是分层的,package.json 提前,只要没修改,就不会重新安装包
  • npm/yarn/cnpm 新版并木有速度太大差距哇,关键是源
  • 添加时区可以有效避免部分包如 aliyun-oss 因时区差异导致的签名失败问题(海外Region)

感受一下速度吧

2017-09-17 12 08 12

RUN apk --update add tzdata

请问这一步能否用到国内镜像呢,部分网络好慢

这块属于具体 docker 系统的命令了,可以自行 google 下如何修改 alpine 的源

@abos5 可以自己找下国内 apk 镜像

@thonatos 是什么构建UI,是docker hub 和github 协作那个吗?

阿里云容器服务

npm run start 时不加--daemon,node 在前台运行, gitlab ci job 一直就会在运行状态 @atian25

@Yang03

CI 不应该跑 egg-scripts start

ci 里面跑的是 docker run -p 7001:7001 --name xx__image xx

dockerFile 最后的命令是 npm run start => egg-script start @thonatos

docker run -d

有人知道 docker run egg项目完成后 无法退出继续执行 linux 命令行是怎么回事?
ctrl+c 都退出不到能输入linux命令的状态

可以在后台运行,这样就不用ctrl+c 了

menkeydyvh notifications@github.com 于2018年9月7日周五 下午6:47写道:

有人知道 docker run egg项目完成后 无法退出继续执行 linux 命令行是怎么回事?
ctrl+c 都退出不到能输入linux命令的状态


You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/eggjs/egg/issues/1431#issuecomment-419401636, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AJt-HqfEt3QpaCIbjpM6aTqRnLYHP1EKks5uYk6_gaJpZM4PZn_N
.

有没有是个人服务器,性能不行,构建放到本地,通过git提交到服务器,然后把node_modules以及打包的静态资源dist外挂磁盘的

你直接丢 ci 去构建不就行了。

在我们公司内 私有云上使用 Docker 部署的 Egg 应用,在使用内置的 workers=os.cpus().length 启动后,在 4G x 4Cpus 的容器实例中 进程数 竟然达到了 50 个(alinode 的监控结果,感谢 alinode平台);
在容器中验证 os.cpus().length = 40,所以我们目前是在 npm scripts 中手动限制了 --workers=4

不知道这是不是我们私有云的 bug,还是 Docker 中确实如此?

在我们公司内 私有云上使用 Docker 部署的 Egg 应用,在使用内置的 workers=os.cpus().length 启动后,在 4G x 4Cpus 的容器实例中 进程数 竟然达到了 50 个(alinode 的监控结果,感觉 alinode平台);
在容器中验证 os.cpus().length = 40,所以我们目前是在 npm scripts 中手动限制了 --workers=4

不知道这是不是我们私有云的 bug,还是 Docker 中确实如此?

发现这个问题,是因发现内部监控平台 memory 曲线是递增的, 怀疑内存泄漏,排查发现的。中间确实改过部分代码,但最终改过 workers 配置后,曲线正常了。

这是 Node && Docker 的 BUG,os.cpus() 无法识别在 docker 里正确的核数

那目前 egg 跑在 docker 里的话只能通过 --workers 先自己手动指定下 woker 数了?

那目前 egg 跑在 docker 里的话只能通过 --workers 先自己手动指定下 woker 数了?

跟平台有关系。我们这里系统环境变量可以获取配置。手动写死也可以。

那目前 egg 跑在 docker 里的话只能通过 --workers 先自己手动指定下 woker 数了?

跟平台有关系。我们这里系统环境变量可以获取配置。手动写死也可以。

是指在系统环境变量里预先写入了 cpu 相关参数,然后在 --workers 指定的时候读取这个环境变量吗?

那目前 egg 跑在 docker 里的话只能通过 --workers 先自己手动指定下 woker 数了?

跟平台有关系。我们这里系统环境变量可以获取配置。手动写死也可以。

是指在系统环境变量里预先写入了 cpu 相关参数,然后在 --workers 指定的时候读取这个环境变量吗?

是的。系统级公共环境变量是平台运维负责维护的,不是业务开发人员。

那目前 egg 跑在 docker 里的话只能通过 --workers 先自己手动指定下 woker 数了?

跟平台有关系。我们这里系统环境变量可以获取配置。手动写死也可以。

是指在系统环境变量里预先写入了 cpu 相关参数,然后在 --workers 指定的时候读取这个环境变量吗?

是的。系统级公共环境变量是平台运维负责维护的,不是业务开发人员。

了解👌,感谢~

ci 里面跑的是 docker run -p 7001:7001 --name xx__image xx

dockerFile 最后的命令是 npm run start => egg-script start @thonatos

ci 一般来说是做build 和 deploy的事情的,直接在ci里 运行docker的情况 不太合适吧

Was this page helpful?
0 / 5 - 0 ratings