#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, для выполнения рутинных задач, таких как выполнение модульных тестов вашего сервиса.