docker容器如何使用另一个构建为可执行文件而不是服务的docker容器

问题描述 投票:0回答:1

目的:

运行容器“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-compose实现这一点,而不将“E”和可能的“E_b”包装到其他nodejs服务中,而是将它们作为可执行文件访问。

让docker在docker里面和使用类似的东西

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

也不理想。

任何干净的解决方案?

node.js docker docker-compose
1个回答
1
投票

如果不通过主机为服务提供无限制的根级访问权限,这是不可能的。这不是您通常希望为具有面向网络的服务的进程提供的权限。

您所描述的最佳方法是通过向其添加“E”可执行文件来使“A”图像自包含。根据它的可执行类型,您可以使用包管理器安装它,或者使其可用

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套接字绑定到容器中。如前所述,这为服务提供了对主机的无限制的根级访问。这种方法的常见缺陷包括shell注入攻击,允许调用者访问docker run -v /:/host ...,文件系统权限问题以及目录映射问题,即docker run -v选项的左侧始终是主机路径,即使它是从容器启动的。我强烈建议避开这条道路。

© www.soinside.com 2019 - 2024. All rights reserved.