我有一个aws ec2微实例(ubuntu服务器),我用它托管了几个web应用程序和一个api服务器。 我使用docker和gitlab ci cd来部署在Node中编写的api服务器。 每当我试图运行构建作业时,它就会崩溃,所有托管的应用程序都无法访问。
Dockerfile是
FROM node:12.3.1
LABEL maintainer Venkatesh A <av1998av@gmail.com>
WORKDIR /www/techdoc-api
ARG db_username
ARG db_password
ARG port
ARG jwt_secret
ARG jwt_expiry
ARG link_text
ARG app_link_text
ARG NODE_ENV
ARG redis_host
ARG redis_port
ARG razorpay_id
ARG razorpay_key
RUN npm install pm2 -g
RUN npm install babel-cli -g
RUN apt-get update && apt-get install -y \
vim
ADD package.json /www/techdoc-api
RUN npm install --production
ADD . /www/techdoc-api
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
RUN cd /www/techdoc-api
RUN rm -f .env
RUN touch .env
RUN echo "port=$port \n\
redis_port=$redis_port \n\
redis_host=$redis_host \n\
razorpay_id=$razorpay_id \n\
razorpay_key=$razorpay_key \n\
db_username=$db_username \n\
db_password=$db_password \n\
link_text=$link_text \n\
app_link_text=$app_link_text \n\
jwt_secret=$jwt_secret \n\
jwt_expiry=$jwt_expiry \n\
NODE_ENV=$NODE_ENV" >> ./.env
EXPOSE 3000
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
docker compose文件如下所示:
version: '2.2'
services:
mysql:
build: ./config/docker_db_config
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
healthcheck:
test: "exit 0"
restart: always
redis:
image: 'redis'
ports:
- "6379:6379"
api:
build: .
depends_on:
mysql:
condition: service_healthy
entrypoint:
- /usr/local/bin/docker-entrypoint.sh
restart: always
ports:
- "3000:3000"
gitlab-ci.yml如下所示。。。
image: docker:stable
services:
- docker:dind
stages:
- build
- deploy
cache:
paths:
- node_modules/
build_app:
stage: build
script:
- docker-compose build mysql
- docker-compose build redis
- docker-compose build --build-arg db_username="${db_username}" --build-arg db_password="${db_password}" --build-arg jwt_secret="${jwt_secret}" --build-arg NODE_ENV="${NODE_ENV}" --build-arg port="${port}" --build-arg redis_port="${redis_port}" --build-arg redis_host="${redis_host}" --build-arg jwt_expiry="${jwt_expiry}" --build-arg razorpay_key="${razorpay_key}" --build-arg razorpay_id="${razorpay_id}" --build-arg link_text="${link_text}" --build-arg app_link_text="${app_link_text}" api
- echo "Build successful."
- docker-compose up -d
- echo "Deployed!!"
only:
- master
是否应在运行新作业之前删除旧容器? 我是否应该在某个地方缓存节点模块? 在运行作业之前,我是否应该确保有足够的空间?
对上述设计中的建议和更改持开放态度。
(注意:我所说的“崩溃”是指我无法ssh进入服务器,除非我重新启动它,并且托管的web应用程序无法访问。)
(注意:我所说的“崩溃”是指我无法ssh进入服务器,除非我重新启动它,并且托管的web应用程序无法访问。)
在运行下面,这三个服务足以使您的微实例崩溃。
t2.micro
RAM 1GB
VCPU 1
因此您可能需要一个更大或更好的实例来在实例之外构建应用程序。
您只需在部署期间使用以下命令进行检查,就可以查看这三个服务消耗的内存docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
f2ebb9370858 node 0.00% 9.078MiB / 15.54GiB 0.06% 6.6kB / 0B 29.1MB / 0B 11
7f5b2daf3a22 redis 0.19% 18.62MiB / 15.54GiB 0.12% 9.94kB / 0B 13MB / 0B 5
378dcc2af8a9 mysql 0.87% 364MiB / 15.54GiB 2.29% 23.8kB / 0B 471kB / 328MB 37
这些服务都在空闲状态下运行,什么也不做,但内存消耗仍然在500mb
左右。
因此可能会出现一个容器占用整个内存的情况,您可以在部署期间使用docker stats
对此进行调试。
在运行作业之前,我是否应该确保有足够的空间?
更好的做法是清理所有进程并停止所有容器,这样就会为部署创造一些空间。 与构建相比,节点模块的安装并不是那么繁重的过程。
(Note: By 'crashing' I mean that im not able to ssh into the server unless i reboot it and the hosted web apps are unreachable)
看你这里的句子。。。。。 我想你的cpu或内存有问题
我们需要实时排除服务器故障
我认为您的实例太小,无法处理您的作业请求。