Есть ли лучший способ сделать песочницу с Docker, чем то, что я делаю ниже? - PullRequest
0 голосов
/ 24 февраля 2019

Я новый пользователь Docker.Мне нужно сделать следующее:

  1. Скомпилировать и запустить на моем компьютере программу C ++ произвольного пользователя (вместе с моими собственными дополнениями к их коду)
  2. Захватить вывод и обработать его локально.

Я использую докер на микроэкземпляре Amazon AWS Linux.Я сделал следующее:

Настроил и собрал образ Ubuntu с именем sandbox, в котором есть все необходимые мне пакеты (g ++, valgrind, make и т. Д.)

В другом каталоге, содержащем мои предустановленные файлы.-req файлы, я копирую файлы пользователя.Затем я создаю новый образ докера из этого каталога, который строится с использованием базового образа песочницы.Мой файл Docker гласит:

FROM sandbox
COPY . /sandbox
RUN make

Затем я запускаю команду сборки Docker из моей локальной среды следующим образом:

307 {aws-028}testcpp: docker build --tag=test .
Sending build context to Docker daemon  35.33kB
Step 1/5 : FROM        sandbox
 ---> 42fdf2be6912
Step 2/5 : MAINTAINER  AVFILT
 ---> Running in d5531528333c
Removing intermediate container d5531528333c
 ---> 561070a04095
Step 3/5 : WORKDIR /sandbox
 ---> Running in 7d1afb32f3ef
Removing intermediate container 7d1afb32f3ef
 ---> e416508e5180
Step 4/5 : COPY . /sandbox
 ---> 8392a378a6a2
Step 5/5 : RUN make
 ---> Running in bf041f3a5353
g++ -Wall -O0 -std=c++0x *.cpp 
valgrind ./a.out  # >a.log 2>&1
==22== Memcheck, a memory error detector
==22== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==22== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==22== Command: ./a.out
==22== 
Success. All tests passed. Congratulations.
==22== 
==22== HEAP SUMMARY:
==22==     in use at exit: 72,704 bytes in 1 blocks
==22==   total heap usage: 3,881 allocs, 3,880 frees, 524,711 bytes allocated
==22== 
==22== LEAK SUMMARY:
==22==    definitely lost: 0 bytes in 0 blocks
==22==    indirectly lost: 0 bytes in 0 blocks
==22==      possibly lost: 0 bytes in 0 blocks
==22==    still reachable: 72,704 bytes in 1 blocks
==22==         suppressed: 0 bytes in 0 blocks
==22== Rerun with --leak-check=full to see details of leaked memory
==22== 
==22== For counts of detected and suppressed errors, rerun with: -v
==22== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Removing intermediate container bf041f3a5353
 ---> 9cf23028b470
Successfully built 9cf23028b470
Successfully tagged test:latest

Я записываю вышеприведенный вывод в локальный файл и затем обрабатываю егоиспользуя сценарий.

Мой вопрос: это лучший способ выполнить то, что я хочу (по сути, вывод make и valgrind)?

Если я делаю это многократно несколько раз, могуЯ предполагаю, что каждый запуск не оставит после себя висячих данных, подлежащих очистке (и, в конечном итоге, исчерпанию дискового пространства)?

Большое спасибо,

&

1 Ответ

0 голосов
/ 25 февраля 2019

Если я делаю это итеративно несколько раз, могу ли я предположить, что при каждом запуске не останется висячих данных, подлежащих очистке (и, в конечном итоге, нехватке дискового пространства)?

Вам гарантировано, что каждый прогон будет оставлять за собой висячие данные, подлежащие очистке: каждый прогон docker build создает новый образ, и они остаются до тех пор, пока не будут явно удалены.Это включает в себя полный файл журнала valgrind и все остальное, что создается и генерируется Makefile.

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

...