Запустить Docker, выполнить команду, выйти

#docker

#docker

Вопрос:

Я пытаюсь запустить тесты в docker как часть моего процесса сборки. Что я хотел бы сделать, так это запустить контейнер docker, проигнорировать обычную точку входа, запустить тестовую команду и немедленно завершить работу со статусом test.

Что-то вроде:

 results=`docker run my_image --entrypoint python -m unittest discover`
 

Когда я пытаюсь это сделать, я получаю: entrypoint requires the handler name to be the first argument

  • Я считаю, что это относится к образу, который я создаю (aws lambda).

Пока я вижу только варианты для каждого: А) запустить контейнер и выполнить произвольную команду или Б) иметь второй файл Dockerfile только для тестирования.

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

Ответ №1:

В идеале вам следует реструктурировать свое приложение, чтобы избежать необходимости переопределять точку входа.

Помните, что при запуске образа команды ENTRYPOINT и CMD объединяются в единую команду. Если вы будете часто заменять эту (комбинированную) командную строку, лучше всего поместить в нее всю команду целиком CMD . Если у вас есть ENTRYPOINT вообще, это должна быть оболочка, которая выполняет команду, переданную ей в качестве аргументов (в сценарии оболочки, с exec "$@" ).

 # Optional entrypoint -- MUST be JSON-array syntax, and MUST `exec "$@"`
# ENTRYPOINT ["/entrypoint.sh"]
CMD python ... whatever you had before
 

Затем, как только вы это сделаете, вы можете легко переопределить командную часть в docker run команде

 docker run my_image python -m unittest discover
 

(Есть два других ENTRYPOINT шаблона, которые я видел. Одним из них является шаблон «контейнер как команда», в котором находится вся командная строка ENTRYPOINT , а командная часть используется для приема дополнительных аргументов; это поддерживает docker run imagename --extra-args шаблон. Если вам действительно нужен этот шаблон, см. Ниже, Чтобы переопределить все это. Второй произвольно разбивается ENTRYPOINT ["python"] , CMD ["script.py"] , но для этого нет особых причин; просто объедините их CMD в.)

Если вы не можете выполнить рефакторинг файла Dockerfile вашего образа, вам необходимо переопределить --entrypoint . Однако этот параметр принимает только одно командное слово и рассматривается как параметр Docker, поэтому он должен предшествовать имени образа. Это приводит к этой неудобной конструкции (разделенной на несколько строк для удобства чтения):

 docker run 
  --entrypoint python 
  my_image 
  -m unittest discover
 

Также рассмотрите возможности использования виртуальной среды хоста, отличной от Docker, для выполнения рутинных задач, таких как выполнение модульных тестов вашего сервиса.