hostadmin
@hostadmin

Как из контейнера запустить команду в «соседнем» (docker-compose) контейнере?

Имеется, например, docker-compose в котором описаны три контейнера, например с именами nginx, php и cron.
Как можно из контейнера cron, выполнить команду на соседнем контейнере, например на контейнере nginx?

Из хоста всё понятно:
docker-compose exec nginx service nginx restart

А вот как сделать тоже самое из контейнера cron?
  • Вопрос задан
  • 1315 просмотров
Решения вопроса 1
kumaxim
@kumaxim
Web-программист
Добавь в нужные тебе контейнеры sshd и, по необходимости, поключайте из одного контейнера в ssh в другой и выполняй что тебе там надо. Это самый правильный путь, на мой взгляд.

Еще можно в контейнер, из которого ты хочешь выполнять команды в других контейнерах, установить docker и прокинуть socket докера с хоста в контейнер. Побочный эффект тут в том, что твой контейнер вдруг баганет, у тебя может рухнить все остальные запущенные контейнеры на хостовой машине.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@mureevms
Я бы добавил крон на хост системе.
Посколько задача не в этом, то я бы сделал доступ из cron контейнера по SSH до хост ситемы и на ней уже выполнять команду. Например:
ssh user@172.17.0.1 docker-compose exec nginx service nginx restart
Ответ написан
hostadmin
@hostadmin Автор вопроса
Я исходил из того, что все контейнеры будут максимально независимы от хоста, чтобы при переносе контейнеров не было необходимости что-то много настраивать (в т.ч. cron).
Наверно самым оптимальным будет вариант, предложенный Максим Кудрявцев , с прокидыванием в контейнер самого докера. Как вариант, можно было установить весь докер в контейнер, но итоговый образ получался 200-300мб. Но оказалось, что уже есть отдельные docker-клиенты.
Итак, конфигурация получилась такая:
В docker-compose.yml добавляем секцию крона:
cron:
        image: cron
        build:
            context: './images/cron'.
        volumes:
#конфиги для крона
                - ./config/cron:/etc/cron.d
#пробрасываем sock в readonly-режиме, чтобы docker внутри контейнера видел всё, что на хосте
                - /var/run/docker.sock:/var/run/docker.sock:ro

В файл images/cron/Dokerfile пишем установку докер-клиента:
#используем сборку alpine с кроном - https://github.com/xordiv/docker-alpine-cron
FROM xordiv/docker-alpine-cron
#скачиваем и устанавливаем сборку с докер клиентом
ARG DOCKER_CLI_VERSION="18.06.3-ce"
ENV DOWNLOAD_URL="https://download.docker.com/linux/static/stable/x86_64/docker-$DOCKER_CLI_VERSION.tgz"
# install docker client
RUN mkdir -p /tmp/download \
    && curl -L $DOWNLOAD_URL | tar -xz -C /tmp/download \
    && mv /tmp/download/docker/docker /usr/bin/ \
    && rm -rf /tmp/download \
    && rm -rf /var/cache/apk/*


Готово! Проверяем:
user1@host:~$ docker-compose exec cron /usr/bin/docker exec user1_nginx_1 nginx -v
nginx version: nginx/1.15.10


Размер 42 мегабайта:
user1@host:~$ docker-compose images
 Container       Repository           Tag           Image Id      Size
------------------------------------------------------------------------
user1_certbot_1   certbot/certbot   latest           4bdc1514009b   108 MB
user1_crond_1     cron              latest           5e632bfd8eb0   42.1 MB
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы