docker -compose & pm2: контейнер покидает немедленно - PullRequest
3 голосов
/ 08 апреля 2020

Я простой разработчик, пытающийся улучшить свои навыки с помощью бэкэнда, и поэтому я написал свой API в nodejs и использую GitLab, AWS EC2, docker и pm2 для обслуживания бэкенда.

Я почти там с базовой настройкой c CI / CD в GitLab, но у меня проблема в том, что мой контейнер docker, похоже, завершает работу сразу после запуска pm2, и я не знаю, как заставить его сохраняться. Вы можете помочь?

Мой очень простой docker-compose.yml выглядит так:

version: '3.7'
services:
  api:
    image: some-repo/some-image:latest

Мой .gitlab-c.yml выглядит так:

image: docker:18.09.7

variables:
  DOCKER_REPO: some-repo
  IMAGE_BASE_NAME: some-image
  IMAGE: $DOCKER_REPO/$IMAGE_BASE_NAME:$CI_COMMIT_REF_SLUG

services:
  - docker:18.09.7-dind

before_script:
  - docker login -u "$DOCKER_REGISTRY_USER" -p "$DOCKER_REGISTRY_PASSWORD"

after_script:
  - docker logout

stages:
  - build
  - deploy

build:
  stage: build
  script:
    - docker build . -t $IMAGE -f $PWD/staging.Dockerfile
    - docker push $IMAGE
    - echo $PWD

deploy:
  stage: deploy
  variables:
    RELEASE_IMAGE: $DOCKER_REPO/$IMAGE_BASE_NAME:latest
  script:
    - docker pull $IMAGE
    - docker tag $IMAGE $IMAGE
    - docker push $IMAGE
    - docker tag $IMAGE $RELEASE_IMAGE
    - docker push $RELEASE_IMAGE
    - apk add openssh-client
    - mkdir -p ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    - chmod 600 $AWS_KEY
    - ssh-keyscan www.gitlab.com >> ~/.ssh/known_hosts
    - ssh -i $AWS_KEY $AWS_URL "cd /home/ubuntu"
    - ssh -i $AWS_KEY $AWS_URL "docker system prune -a -f"
    - ssh -i $AWS_KEY $AWS_URL "docker login -u $DOCKER_REGISTRY_USER -p $DOCKER_REGISTRY_PASSWORD"
    - ssh -i $AWS_KEY $AWS_URL "docker pull $RELEASE_IMAGE"
    - ssh -i $AWS_KEY $AWS_URL "/snap/bin/docker-compose stop"
    - ssh -i $AWS_KEY $AWS_URL "/snap/bin/docker-compose up -d"
    - ssh -i $AWS_KEY $AWS_URL "docker logout"

Мой staging.Dockerfile выглядит так:

FROM node:latest

LABEL author="Mark Norgate"

WORKDIR /var/www/api

ENV ENVIRONMENT_CONFIG=staging

COPY ./src ./src
COPY ./package.json ./package.json
COPY ./tsconfig.json ./tsconfig.json
COPY ./.pm2/staging/ecosystem.config.js ./ecosystem.config.js
COPY ./credentials/some-credentials.json ./some-credentials.json

RUN npm install
RUN npm install --global typescript
RUN tsc -p .
RUN npm install --global pm2

EXPOSE 3001
EXPOSE 3002
EXPOSE 27017

ENTRYPOINT ["pm2", "start", "/var/www/api/ecosystem.config.js"]

, а мой ecosystem.config.js выглядит так:

module.exports = {
  apps : [{
    name: 'API',
    script: '/var/www/api/lib/server.js',
    env: {
      GOOGLE_APPLICATION_CREDENTIALS: '/var/www/api/some-credentials.json'
    }
  }]
};

Теперь кажется, что все это работает; за исключением того, что, как я уже сказал, контейнер завершается, как только эта команда pm2 выполняется. Я подумал, что это может быть просто, как запустить docker-compose up в отдельном режиме, но это не помогло.

Кто-нибудь может определить мою ошибку / упущение?

1 Ответ

2 голосов
/ 14 апреля 2020

Вы можете попробовать pm2-runtime вместо pm2 для упрощения интеграции контейнера - документы здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...