Как Docker-контейнер может использовать другой Docker-контейнер, созданный как исполняемый файл, а не как служба - PullRequest
0 голосов
/ 30 апреля 2019

Цель:

Запуск контейнера "A", который в основном является сервером nodejs.Этот сервер должен запускать исполняемый файл, такой как «E», который отображается в другом работающем контейнере.

в упрощенном коде.«A» содержит этот фрагмент кода, который использует «E».

const spawn = require('child_process').spawn;

const someArgsForE = {
  arg1:"some_string",
  arg2:123
};

// E is the executable that would be normally run as 'docker run E '{ arg1:"some_string", arg2:123}' ... (ignore the correct escaping)
let childProcess = spawn("E", [JSON.stringify(someArgsForE)]);

childProcess.on('close', (code, signal) => {
  //do whatever with the result... maybe write in a volume
});

В идеале «A» может реализовать некоторую логику, чтобы он мог знать о существовании «E».

If(serviceExists("E")){ ... do whatever ...}

Поскольку еще один исполняемый файл "E_b" может существовать и использоваться тем же сервером "A".

Я не могу понять, как я могу добиться этого с помощью docker-составьте без переноса "E" и, возможно, "E_b" в другие службы nodejs, но обращайтесь к ним как к исполняемым файлам.

Чтобы иметь докер внутри докера и использовать что-то вроде

let childProcess = spawn("docker", ["run", "E", args]);

,тоже не идеал.

Любое чистое возможное решение?

1 Ответ

1 голос
/ 30 апреля 2019

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

Лучший подход к описываемому вами способу - сделать образ «А» автономным, просто добавив к нему исполняемый файл «Е». В зависимости от того, какой это исполняемый файл, вы можете установить его с помощью менеджера пакетов или иным образом сделать его доступным

FROM node

# Some things are installable via APT
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install -y --no-install-recommends \
      e-executable

# Or sometimes you have an executable or tarball available locally
ADD f-executable.tar.gz /usr/local

# Routine stuff for a Node app
WORKDIR /app
COPY package.json yarn.lock .
RUN yarn install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

Альтернативный подход состоит в том, чтобы присоединить разъем Docker хоста в контейнер. Как упоминалось ранее, это предоставляет сервису неограниченный доступ корневого уровня через хост. К распространенным недостаткам этого подхода относятся атаки с внедрением оболочки, которые позволяют вызывающему абоненту docker run -v /:/host ..., проблемы с разрешениями файловой системы и проблемы с отображением каталогов, когда левая часть параметра docker run -v всегда представляет собой путь к хосту, даже если он запускается из контейнер. Я настоятельно рекомендую избегать этого пути.

...