docker-in-docker测试从gitlab-ci

时间:2020-02-27 15:08:52

标签: docker gitlab-ci pyodbc

我正在寻求帮助以解决在docker中运行的API端点的问题 从另一个泊坞窗中调用时返回状态码500。 该问题似乎特定于以下情况:将请求从Docker映像发送到在另一个docker中运行的API端点,并且要从外部MS SQL数据库中获取数据。

背景

API从MS SQL数据库中获取数据。 问题发生在gitlab-ci.yml的最后阶段, 通过在Docker映像中将API发布到API公开的端点来测试API。

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中,测试失败了。 我有两项测试通过,但其中/ predict端点尝试获取数据的一项失败。 如果我使用数据的本地缓存版本,它将通过。

有人可以解释为什么吗?

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

0 个答案:

没有答案