docker -in- docker Тестирование docker извлечения API из базы данных в gitlab-ci - PullRequest
0 голосов
/ 27 февраля 2020

Мне нужна помощь для решения проблемы с конечной точкой API, работающей в docker, которая возвращает код состояния 500 при вызове из другого docker. Кажется, проблема связана с c в случае, когда запрос отправляется из образа docker на конечную точку API, работающую в другой docker, и данные должны извлекаться из внешней базы данных MS SQL.

background

API извлекает данные из базы данных MS SQL. проблема возникает на последнем этапе в gitlab-ci.yml, где API тестируется путем отправки в конечную точку, представленную API в образе docker.

test этап в gitlab-ci.yml завершается с проверить, как показано ниже:

import pytest

def test_post_predict(client, model_input):
    response = client.post('/predict', json=model_input)
    assert response.status_code == 200

Что указывает на то, что конечная точка /predict работает так, как ожидалось.

Но на последнем этапе docker-test проверка не пройдена. У меня есть два прохождения теста, но тот, в котором конечная точка / предиката пытается получить данные, терпит неудачу. Это проходит, если я использую локальную кэшированную версию данных.

Может ли кто-нибудь предложить объяснение, почему?

import requests

#passes
def test_root():
    r = requests.get('http://127.0.0.1:8089/')
    assert r.status_code == 200

#passes
def test_posting_local(model_input):
    model_input['db'] = 'local'                     
    r = requests.post('http://127.0.0.1:8089/predict', json=model_input)
    assert r.status_code == 200
    assert 'result' in r.json()

#fails  
def test_posting_database(model_input):             
    r = requests.post('http://127.0.0.1:8089/predict', json=model_input)
    assert r.status_code == 200
    assert 'result' in r.json()

Dockerfile

FROM python:3.6-slim-stretch

ENV FREETDS_VERSION 1.1

RUN apt-get update \
    && apt-get install -y \
        curl \
        apt-transport-https \
        make \
        build-essential \
        unixodbc \
        unixodbc-dev \
        gnupg2 \
        tzdata \
        freetds-dev \
        freetds-bin \  
        tdsodbc \
        libc6-dev \
        wget

RUN wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-$FREETDS_VERSION.tar.gz \
    && tar -xzf freetds-$FREETDS_VERSION.tar.gz \
    && cd freetds-$FREETDS_VERSION \
    && ./configure --prefix=/usr/local --with-tdsver=7.4 \
    && make \
    && make install \
    && rm -f /freetds-$FREETDS_VERSION.tar.gz \
    && rm -rf /freetds-$FREETDS_VERSION


RUN ln -fs /usr/share/zoneinfo/America/Fortaleza /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
RUN pip install --upgrade pipenv

#write a proper odbcinst.ini file
RUN echo "[FreeTDS]\nDescription=FreeTDS Driver\nDriver=/usr/local/lib/libtdsodbc.so\nSetup=/usr/lib/odbc/libtdsS.so\nUsageCount=1" > /etc/odbcinst.ini


RUN mkdir -p /app
WORKDIR /app

COPY Pipfile /app
COPY Pipfile.lock /app
COPY run.sh /app
COPY model /app/model

RUN python -m pip install pipenv
RUN pipenv install --deploy --system


EXPOSE 8089


CMD ["sh", "run.sh"]

gitlab-ci.yml

variables:
  IMAGE_NAME: "$CI_REGISTRY_IMAGE/model:$CI_COMMIT_SHA"
  IMAGE_NAME_CACHE: $CI_REGISTRY_IMAGE/model:CACHE
  DOCKER_HOST: tcp://localhost:2375 # this is needed for the builds to work with the new kubernetes runner.
  DOCKER_DRIVER: overlay2 # This will increase performance slightly

stages:
- docker
- test
- docker-test

docker:
  image: docker
  stage: docker
  services:
    - docker.xxxxxxxxx/kubernetes/docker-dind:latest
  script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker pull $CI_REGISTRY_IMAGE:latest || true
    - docker build --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
    - docker push $CI_REGISTRY_IMAGE:latest
  only:
    changes:
      - "Pipfile.lock"
      - "Dockerfile"
  when: always

test:
  variables:
    GIT_SUBMODULE_STRATEGY: recursive
  image: $CI_REGISTRY_IMAGE:latest

  stage: test
  script:
  - pip install pipenv
  - pipenv install --dev --system
  - pytest tests

model-image-test:
  image: python:3.6-stretch
  stage: docker-test
  services:
    - $CI_REGISTRY_IMAGE:latest
  before_script:
    - pip install pytest requests
    - echo $IMAGE_NAME
  script:
    - cd docker-test
    - pytest
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...