Как запустить скрипт оболочки внутри docker-compose - PullRequest
0 голосов
/ 14 октября 2019

У меня есть сценарий использования, в котором я пытаюсь построить основанный на django api rest и затем использовать непрерывную интеграцию с использованием travis CI, когда изменения передаются в github. Я также использую docker для сборки и docker-compose для масштабирования моих сервисов. Проблема в том, что я хочу запустить pytest и flake8, когда я помещаю свои изменения в githubТеперь я не добавил никаких тестов и, следовательно, команда pytest дает статус выхода 5.

Чтобы обойти это, я попытался создать скрипт для этого:

#!/bin/bash

pytest;
err=$? ;
if (( $err != 5 )) ;
then
  exit $err;
fi
flake8 ;

Но яне может получить docker-compose для запуска этого. Когда я запускаю скрипт с помощью команды:

docker-compose run app sh -c "run_script.sh"

Это выдает следующее сообщение об ошибке: sh: run_script.sh: not found

Ниже приведен мой файл docker-compose yml:

version: "3"

services:
  app:
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
    command: >
      sh -c "python manage.py runserver 0.0.0.0:8000"

Ниже приведен dockerfile:

FROM python:3.7-alpine

MAINTAINER Subhayan Bhattacharya

ENV PYTHONUNBUFFERED 1

COPY Pipfile* /tmp/

RUN cd /tmp && pip install pipenv && pipenv lock --requirements > requirements.txt

RUN pip install -r /tmp/requirements.txt

RUN mkdir /app

WORKDIR /app

COPY ./app /app

RUN adduser -D user
USER user

Это должно быть простой проблемой, но я не могу понять, как обойти это.

Может кто-нибудь, пожалуйста, помогите мненайти решение

1 Ответ

2 голосов
/ 14 октября 2019

Ваш скрипт не работает, потому что базовые образы Alpine не имеют GNU bash. Ваш скрипт почти ограничивается POSIX Shell Command Language ;если вы это сделаете, вы можете изменить строку «shebang» на #!/bin/sh.

#!/bin/sh
# ^^^ not bash
pytest    # individual lines don't need to end with ;
err=$?
# use [ ... ] (test), not ((...))
if [ "$err" -ne 5 ] && [ "$err" -ne 0 ]; then
  exit "$err"
fi
flake8

В контексте системы CI важно удалить строку volumes:, которая монтирует локальный каталог надкаталог /app вашего контейнера: наличие этой строки означает, что вы вообще не тестируете то, что находится в вашем образе, а вместо этого возможно связанное дерево кода, которое находится в хост-системе.

На практике я бы предложил запустить обаиз этих инструментов в среде, отличной от Docker. Будет проще запустить их и собрать их результаты. В частности, проверка стиля, такая как flake8, будет очень мало зависеть от запуска системных пакетов или других контейнеров, и в идеале ваши модульные тесты также могут выполняться без сложного в настройке контекста, такого как контейнер базы данных. Я бы предложил следующую последовательность:

  1. Проверьте исходный код.
  2. Создайте виртуальную среду и установите ее зависимости.
  3. Выполните pytest, flake8 и аналогичные инструменты тестирования.
  4. Затем создайте образ Docker без инструментов только для тестирования.
  5. Запустите образ с его различными зависимостями.
  6. Запустите дальнейшие тесты на основепо сети звонит в контейнер.
...