Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

eggjs + docker 最佳实践 #1431

Closed
tsui66 opened this issue Sep 15, 2017 · 29 comments
Closed

eggjs + docker 最佳实践 #1431

tsui66 opened this issue Sep 15, 2017 · 29 comments

Comments

@tsui66
Copy link

tsui66 commented Sep 15, 2017

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

@atian25
Copy link
Member

atian25 commented Sep 15, 2017

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

@thonatos
Copy link
Member

thonatos commented Sep 16, 2017

#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 会有问题,如果没特殊要求换高版本吧

@tsui66
Copy link
Author

tsui66 commented Sep 17, 2017

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

@atian25
Copy link
Member

atian25 commented Sep 17, 2017 via email

@thonatos
Copy link
Member

thonatos commented Sep 17, 2017

tips

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

感受一下速度吧

2017-09-17 12 08 12

@abos5
Copy link

abos5 commented Sep 29, 2017

RUN apk --update add tzdata

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

@atian25
Copy link
Member

atian25 commented Sep 29, 2017

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

@popomore
Copy link
Member

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

@VectorHo
Copy link

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

@thonatos
Copy link
Member

阿里云容器服务

@Yang03
Copy link

Yang03 commented Jul 31, 2018

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

@thonatos
Copy link
Member

thonatos commented Aug 1, 2018

@Yang03

CI 不应该跑 egg-scripts start

@Yang03
Copy link

Yang03 commented Aug 1, 2018

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

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

@popomore
Copy link
Member

popomore commented Aug 1, 2018

docker run -d

@menkeydyvh
Copy link

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

@Yang03
Copy link

Yang03 commented Sep 8, 2018 via email

@muzi131313
Copy link

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

@atian25
Copy link
Member

atian25 commented Jul 17, 2019

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

@magnnus
Copy link

magnnus commented Jan 14, 2020

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

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

@magnnus
Copy link

magnnus commented Jan 14, 2020

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

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

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

@atian25
Copy link
Member

atian25 commented Jan 14, 2020

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

@Carrotzpc
Copy link
Contributor

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

@magnnus
Copy link

magnnus commented Mar 26, 2020

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

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

@Carrotzpc
Copy link
Contributor

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

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

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

@magnnus
Copy link

magnnus commented Apr 7, 2020

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

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

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

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

@Carrotzpc
Copy link
Contributor

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

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

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

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

了解👌,感谢~

@shenzhim
Copy link

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

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

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

@brizer
Copy link

brizer commented Jun 2, 2021

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

构建dockerfile时通过ENTRYPOINT ["sh", "start.sh"],去start.sh里start ,不带daemon参数就可以又绕过ci的pending,又docker部署了。

@huanlirui
Copy link

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

这个最有用!!!坑死我了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests