Мне нужна помощь для решения проблемы с конечной точкой 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