我有一台 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
进入服务器并运行部署命令,不断观察docker 状态
,你会得到一些有价值的见解。 - Adiii