Контейнер Docker завершается с кодом 2 при развертывании приложения узла в Digital Ocean через конвейер Gitlab CI / CD

#node.js #docker #express #gitlab #gitlab-ci-runner

# #node.js #docker #экспресс #gitlab #gitlab-ci-runner

Вопрос:

Всем доброе утро, я пытаюсь развернуть свое приложение узла в Digital Ocean через конвейер Gitlab CI / CD. Конвейер завершен успешно и развертывается для выполнения, но контейнер завершается с кодом (2). Мое приложение узла использует порт 3000. Я использую pm2 для запуска сервера, но открыт для использования pm2. Ниже приведен мой файл docker и мой файл .yml.

 # ssh-keyscan gitlab.com >> authorized_keys: use this command to add gitlab ssh keys to sever. Run on server terminal
# cat id_rsa.pub >> authorized_keys Run this command on the sever on the terminal. 
# Both COMMANDS ABOVE ARE necessary.

stages:
  - build
  - publish
  - deploy

variables:
  TAG_LATEST: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:latest
  TAG_COMMIT: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHA

build-Node:
  image: node:latest
  stage: build
  script:
    - npm install
    - echo   "ACCOUNT_SID=$ACCOUNT_SID" >> .env
    - echo   "AUTH_TOKEN=$AUTH_TOKEN" >> .env
    - echo   "API_KEY=$API_KEY" >> .env
    - echo   "API_SECRET=$API_SECRET" >> .env
    - echo   "PHONE_NUMBER=$PHONE_NUMBER" >> .env
    - echo    "sengrid_api=$sengrid_api" >> .env

build-Docker:
  image: docker:latest
  stage: build
  services:
    - docker:dind
  script:
    - docker build . -t $TAG_COMMIT -t $TAG_LATEST 
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker push $TAG_COMMIT
    - docker push $TAG_LATEST

deploy:
  image: ubuntu:latest
  stage: deploy
  tags:
    - deployment
  before_script:
  - 'which ssh-agent || ( apt-get update -y amp;amp; apt-get install openssh-client git -y )'
  - eval $(ssh-agent -s)
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - echo "$SSH_PRIVATE_KEY" | tr -d 'r' > ~/.ssh/id_rsa
  - echo "$SSH_PUBLIC_KEY" | tr -d 'r' > ~/.ssh/id_rsa.pub
  - chmod 600 ~/.ssh/*
  - chmod 644 ~/.ssh/*.pub
  - ssh-add
  - ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts
  - ls -ld ~/.ssh/*
  script:
    - ssh   -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY"
    - ssh  -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker pull $TAG_COMMIT"
    - ssh  -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker container rm -f my-app || true"
    - ssh  -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker run -d -p 80:3000 --name my-app $TAG_COMMIT"
  environment:
    name: production
    url: http://167.172.225.124
  only:
    - master 
 FROM node:12.18.3
    # make the starting directory the current one
     WORKDIR /
    # COPY Package.json 
    COPY package*.json / 
     # install the dependencines within the app
      RUN npm install
     # Install pm2 
      RUN npm install pm2 -g
     # Copy Source Code 
        COPY . .
        

    # Have docker container use port 3000, that is the port that the node app is set to
     EXPOSE 3000
   # Start the node app 
   CMD ["pm2-runtime", "./bin/www"]
         

Комментарии:

1. Что говорят журналы из контейнера, когда он умирает?

2. Ошибка: имя пользователя требуется для нового Twilio (/node_modules/twilio/lib/rest/Twilio.js:132:11)

3. Эта ошибка означает, что мои ключи api не передаются, но мой файл .env находится в папке моего приложения. Часть . файл yml предназначен для создания файла .env

4. Я не уверен, почему файл .env не существует внутри моего контейнера

5. Я добавил —env-file .env в строку запуска docker перед флагом -d, и там написано «docker: open .env: такого файла или каталога нет».

Ответ №1:

Я взял инструкции echo и поместил их перед командой сборки dock на этапе сборки docker. Я не использовал артефакты.