Создать приложение реакции + Gitlab CI + капля Digital Ocean - конвейер успешно завершен, но контейнер Docker удален сразу после - PullRequest
0 голосов
/ 28 января 2019

У меня первые шаги в Docker / CI / CD.

Для этого я пытаюсь развернуть необработанное create-реагировать-приложение на мою каплю Digital Ocean(Docker One-Click Application) с использованием Gitlab CI.Это мои файлы:

Dockerfile.yml

# STAGE 1 - Building assets
FROM node:alpine as building_assets_stage
WORKDIR /workspace

## Preparing the image (installing dependencies and building static files)
COPY ./package.json .
RUN yarn install
COPY . .
RUN yarn build

# STAGE 2 - Serving static content
FROM nginx as serving_static_content_stage
ENV NGINX_STATIC_FILE_SERVING_PATH=/usr/share/nginx/html
EXPOSE 80
COPY --from=building_assets_stage /workspace/build ${NGINX_STATIC_FILE_SERVING_PATH}

docker-compose.yml

## Use a Docker image with "docker-compose" installed on top of it.
image: tmaier/docker-compose:latest
services:
  - docker:dind

variables:
  DOCKER_CONTAINER_NAME: ${CI_PROJECT_NAME}
  DOCKER_IMAGE_TAG: ${SECRETS_DOCKER_LOGIN_USERNAME}/${CI_PROJECT_NAME}:latest

before_script:
  ## Install ssh agent (so we can access the Digital Ocean Droplet) and run it.
  - apk update && apk add openssh-client
  - eval $(ssh-agent -s)

  ## Write the environment variable value to the agent store, create the ssh directory and give the right permissions to it.
  - echo "$SECRETS_DIGITAL_OCEAN_DROPLET_SSH_KEY" | ssh-add -
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh

  ## Make sure that ssh will trust the new host, instead of asking
  - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config

  ## Test that everything is setup correctly
  - ssh -T ${SECRETS_DIGITAL_OCEAN_DROPLET_USER}@${SECRETS_DIGITAL_OCEAN_DROPLET_IP}

stages:
  - deploy

deploy:
  stage: deploy
  script:
    ## Login this machine into Docker registry, creates a production build and push it to the registry.
    - docker login -u ${SECRETS_DOCKER_LOGIN_USERNAME} -p ${SECRETS_DOCKER_LOGIN_PASSWORD}
    - docker build -t ${DOCKER_IMAGE_TAG} .
    - docker push ${DOCKER_IMAGE_TAG}

    ## Connect to the Digital Ocean droplet, stop/remove all running containers, pull latest image and execute it.
    - ssh -T ${SECRETS_DIGITAL_OCEAN_DROPLET_USER}@${SECRETS_DIGITAL_OCEAN_DROPLET_IP}
    - docker ps -q --filter "name=${DOCKER_CONTAINER_NAME}" | grep -q . && docker stop ${DOCKER_CONTAINER_NAME} && docker rm -fv ${DOCKER_CONTAINER_NAME} && docker rmi -f ${DOCKER_IMAGE_TAG}
    - docker run -d -p 80:80 --name ${DOCKER_CONTAINER_NAME} ${DOCKER_IMAGE_TAG}

    # Everything works, exit.
    - exit 0
  only:
    - master

ВВкратце, на Gitlab CI я делаю следующее:

  1. (before_install) Установите агент ssh и скопируйте мой личный ключ SSH на эту машину, чтобы мы могли подключиться к дроплету Digital Ocean;

  2. (развернуть) Я создаю свой образ и помещаю его в общедоступный репозиторий док-станции;

  3. (развертываю) Я подключаюсь к своему цифровому океануКапли через SSH, потяните только что созданный образ и запустите его.

Проблема в том, что если я все делаю с терминала моего компьютера, контейнер создается и приложение успешно развертывается.

Если я выполню его из задачи Gitlab CI, контейнер сгенерирован, но ничего не развернуто, потому что контейнер умирает сразу после (нажмите здесь, чтобы увидеть выходные данные задания CI) .

Я могу гарантировать, что контейнер стирается, потому что, если я вручную SSH сервер и docker ps -a, он ничего не слушает.

Я в основном смущен тем, что этот образ CMD CMD ["nginx", "-g", "daemon off;"], что не должно приводить к удалению моего контейнера, так как на нем запущен процесс.

Что я делаю не так?Я потерян.

Заранее спасибо.

1 Ответ

0 голосов
/ 28 января 2019

На мой вопрос ответил dg - большое спасибо!

Проблема заключается в том, что я подключался к моей цифровой океанической капле через SSHи выполнение команд внутри, используя его bash, когда я должен передать всю команду для выполнения в качестве аргумента инструкции подключения ssh.

Изменил мой файл .gitlab.yml из:

    ## Connect to the Digital Ocean droplet, stop/remove all running containers, pull latest image and execute it.
    - ssh -T ${SECRETS_DIGITAL_OCEAN_DROPLET_USER}@${SECRETS_DIGITAL_OCEAN_DROPLET_IP}
    - docker ps -q --filter "name=${DOCKER_CONTAINER_NAME}" | grep -q . && docker stop ${DOCKER_CONTAINER_NAME} && docker rm -fv ${DOCKER_CONTAINER_NAME} && docker rmi -f ${DOCKER_IMAGE_TAG}
    - docker run -d -p 80:80 --name ${DOCKER_CONTAINER_NAME} ${DOCKER_IMAGE_TAG}

Кому:

# Execute as follow:
# ssh -t digital-ocean-server "docker cmd1; docker cmd2;
- ssh -T ${SECRETS_DIGITAL_OCEAN_DROPLET_USER}@${SECRETS_DIGITAL_OCEAN_DROPLET_IP} "docker ps -q --filter \"name=${DOCKER_CONTAINER_NAME}\" | grep -q . && docker stop ${DOCKER_CONTAINER_NAME} && docker rm -fv ${DOCKER_CONTAINER_NAME} && docker rmi -f ${DOCKER_IMAGE_TAG}; docker run -d -p 80:80 --name ${DOCKER_CONTAINER_NAME} ${DOCKER_IMAGE_TAG}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...