我正在寻求帮助以解决在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