Выполнить команду из одного контейнера в другой

#python #node.js #python-3.x #docker #docker-compose

#python #node.js #python-3.x #docker #docker-составить

Вопрос:

У меня есть два докеризованных проекта: один с использованием NodeJS, а другой с использованием Python

Я хочу запустить выполнение скрипта Python (в контейнере с приложением Python) из приложения NodeJS.

В принципе, приложение NodeJS будет запускать что-то вроде exec('python3 script.py') , но ожидается, что оно будет запущено в контейнере приложения Python.

Как я могу добиться именно такого поведения? Заранее спасибо!

Комментарии:

1. Если вы хотите запускать код python внутри вашего nodejs cotainer, почему бы вам не добавить код python в контейнер nodejs?

2. Это зависит от того, что это за приложения, какова их цель и какова цель упомянутого скрипта, но в целом то, что вы хотите, — это нарушение безопасности и / или недостаток архитектуры. Технически это возможно, но вам действительно следует избегать таких отношений между сервисами.

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

4. @DanilaKiver ок .. спасибо за информацию

Ответ №1:

Контейнеры Docker представляют собой реализацию архитектуры микросервиса. Ожидается, что они будут достаточно разделены и будут взаимодействовать между собой с использованием TCP (обычно HTTP). Таким образом, ваш контейнер python должен предоставлять некоторый вызов REST (например).

Есть способ обойти это, но он не рекомендуется, поскольку он открывает ваш демон docker любому, кто работает внутри контейнера nodejs. Я привожу это здесь, поскольку это может быть полезно во время разработки.

1 — Установите Docker CLI
В свой nodejs Dockerfile, добавьте следующие строки:

 ENV DOCKER_VERSION=18.09.4
RUN curl -sfL -o docker.tgz "https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz" amp;amp; 
  tar -xzf docker.tgz docker/docker --strip=1 --directory /usr/local/bin amp;amp; 
  rm docker.tgz
  

При этом устанавливается только минимальная часть CLI полной загрузки docker.

2 — Смонтировать привязку к сокету docker.
В свой файл compose добавьте следующее:

 services:
  mypython:
    container_name: mypython
    ...
  mynodejs:
    ...
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock 
  

3 — Вызовите свой скрипт на python.
Изнутри вашего контейнера nodejs теперь вы можете использовать docker CLI.

 # Log into your nodejs container first
docker exec -it mynodejs sh
# and execute some command in another container
docker exec mypython python3 script.py
  

Приведенный выше самый простой способ сделать это. Вы также можете избежать установки Docker CLI и использовать Docker API напрямую, но обычно для этого требуется, чтобы вы написали несколько строк для того, что делает Docker CLI, всего в одной.

Комментарии:

1. Помните, что если вы сделаете это, процесс узла получит неограниченный доступ на уровне root через хост . Будьте действительно, очень осторожны с любым путем, который начинается с сетевого запроса и заканчивается выполнением команды Docker: таким образом очень легко внедрить вашу систему.

2. Спасибо за помощь… В любом случае, когда я пытаюсь запустить скрипт python, по какой-то причине не установлен docker cli :/

3. @JahirFiquitiva . Возникла проблема с форматированием строки Dockefile выше. Скопируйте ее снова. кстати, вы можете отладить Dockerfile, просто выполнив инструкции по запуску в существующем контейнере и посмотрев, что не работает.

4. Строка для версии должна быть ENV DOCKER_VERSION=18.09.3

5. положение флага tar, --directory он же -C, имеет решающее значение. Чтобы устранить возможную проблему (docker не найден) в приведенной выше команде, переместите команду —directory перед docker/docker , чтобы иметь это: ENV DOCKER_VERSION=18.09.4 RUN curl -sfL -o docker.tgz "https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz" amp;amp; tar -xzf docker.tgz --directory /usr/local/bin docker/docker --strip=1 amp;amp; rm docker.tgz