Как использовать curl (или подобное программное обеспечение) с запуском докера, если ENTRYPOINT уже используется?

Я хочу создать образ докера с сервером Tor/aiohttp для использования в качестве прокси-сервера для HTTP-запросов (в основном curl). Я уже подготовил рабочий образ Docker (с ним я могу использовать внешний curl -x), основная проблема с синтаксисом.

Что мне нужно: мне нужно использовать это изображение, например docker run test_image curl api.ipify.org. Основная проблема - я не понимаю, как правильно настроить ENTRYPOINT/CMD. Я использую supervisor для активации сервисов (tor/aiohttp), поэтому последняя строка моего образа Docker:

ENTRYPOINT ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

Вопрос. Как настроить образ Docker (используя ENTRYPOINT/CMD), чтобы образ запускал мой curl-запрос после активации служб?

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

Так что нужен совет о логике/синтаксисе Docker, чтобы я мог заставить его работать.


person sortas    schedule 08.12.2018    source источник
comment
Почему важно запускать curl из контейнера? Почему важно, чтобы контейнер запускал несколько служб?   -  person David Maze    schedule 08.12.2018
comment
Это академическая задача с прямыми условиями. У меня нет проблем ни с curl, ни с запуском сервисов, главный вопрос - как совместить ENTRYPOINT с каким-то внешним софтом (curl, или ping, или tracert и т.д.).   -  person sortas    schedule 08.12.2018


Ответы (1)


Вы можете запустить ENTRYPOINT как сценарий оболочки вместо команды:

https://success.docker.com/article/use-a-script-to-initialize-stateful-container-data

докер-entrpoint.sh

#!/bin/bash
set -e

/usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
curl api.ipify.org

Докерфайл

FROM debian:stretch
...
COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]
person DevOps Dan    schedule 08.12.2018
comment
Это работает, но мне нужно использовать curl из docker run, поэтому я могу указать URL-адрес и т. Д. Из CLI. Конечно, я могу использовать переменные env, но из-за условий мне нужно работать с curl (или другим программным обеспечением) из docker run test_image curl www.someurl.com. - person sortas; 08.12.2018
comment
Вы можете переопределить ENTRYPOINT во время выполнения, но мы начинаем нарушать некоторые принципы Docker: docker run --rm -it --entrypoint "curl http://google.com" test_image - person DevOps Dan; 08.12.2018
comment
docker run test_image 'curl someurl.com' - бесполезно - person sortas; 08.12.2018
comment
Вы можете переопределить ENTRYPOINT во время выполнения - я могу, но мне все же нужно запускать службы перед использованием curl, чтобы он мог использовать служебные сокеты в качестве прокси. - person sortas; 08.12.2018
comment
Не нужно запускать curl С контейнером, curl был на новой строке, когда я думал, что он на той же :) - person sortas; 09.12.2018