Компилировать внутри контейнера Docker без огромных размеров контейнера - PullRequest
0 голосов
/ 12 октября 2018

Я создаю сервис автоматического тестирования для моего университета.Мне нужно взять код студента, поместить его в каталог проекта и запустить тесты.

Это необходимо сделать для нескольких разных языков расширяемым способом.

Мой первоначальный план:

  • Иметь «базовый образ» для каждого языка (т. Е. Установить языковую среду выполнения на buildpack-deps:stretch)
  • Получить пользовательские файлы и готовую структуру проекта
  • Поставить пользователяфайлы в правильное место в проекте
  • Создание образа проекта, расширяющего базовое изображение
  • Запустите контейнер.Он скомпилирует проект и запустит тесты.
  • Сохраните результаты теста в базу данных, остановите и удалите изображение
  • Повторите промывку для каждой отправки

При тестировании вручнуюРазмеры огромны! Размер почти 1,5 ГБ!Я устанавливаю среду выполнения для one языка, и я тестировал с Hello World - так что проект тоже не был большим.

Это "работает", но кажется очень неэффективным.Я также очень новичок в Docker - есть ли лучший способ сделать это?

Cheers

1 Ответ

0 голосов
/ 12 октября 2018

В этом конкретном приложении я бы, вероятно, скомпилировал бы программу в контейнере, а не создал бы из нее образ (так как вы немедленно выбрасываете его, а компиляция и тестирование являются важной частью, и, как правило, выпосле этого не требуется ничего для сборки).

Если вы предполагаете, что входной файл каким-то образом попадает в контейнер, вы можете написать скрипт, который выполняет сборку и тестирование:

#!/bin/sh
cd /project/src/student
tar xzf "/app/$1"
cd ../..
make
...
curl ???  # send the test results somewhere

Тогда ваш Dockerfile просто встраивает это в образ, без какого-либо конкретного кода студента

FROM buildpack-deps:stretch
RUN apt-get update && apt-get install ...
RUN adduser user
COPY build_and_test.sh /usr/local/bin
USER user
ADD project-structure.tar.gz /project

Затем, когда вы действительно запускаете его, вы можете использовать опцию docker run -v для добавленияпредставленный код.

docker run --rm -v $HOME/submissions:/app theimage \
  build_and_test.sh student_name.tar.gz

В исходном решении обратите внимание, что наиболее важными из них, вероятно, будут среда выполнения языка, набор инструментов C и связанные заголовочные файлы, и поэтому, пока вы получаете по-видимому огромное изображение, всеэти вещи происходят из слоев в базовом изображении и поэтому распределяются между отдельными сборками (это не занимаетой как ты думаешь)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...