从另一个容器在Docker容器中运行可执行文件

时间:2019-07-08 20:56:59

标签: docker docker-compose

我正在尝试从另一个Docker容器中运行可执行文件,而该文件已经在Docker容器中。这可能吗?

version: '3.7'
services:
  py:
    build: .
    tty: true
    networks:
      - dataload
    volumes:
      - './src:/app'
      - '~/.ssh:/ssh'

  winexe:
    build: 
      context: ./winexe
      dockerfile: Dockerfile
    networks:
      - dataload
    ports: 
      - '8001:8001'
    volumes:
      - '~/path/to/winexe:/usr/bin/winexe'
      - '~/.ssh:/ssh'
    depends_on:
      - py

networks:
  dataload:
    driver: bridge

我正在尝试从'py'访问Winexe

2 个答案:

答案 0 :(得分:0)

假设您的意思是从一个容器内部运行另一个Docker容器,可以通过以下几种方法完成该操作:

在容器中安装docker命令,并:

  1. 通过TCP / IP与托管Docker实例联系。为此,您必须将Docker主机公开到网络,这既不是默认设置,也不建议这样做。
  2. 使用卷将Docker套接字(通常为/var/run/docker.sock)映射到您的容器中。这将允许容器内的docker命令直接与主机实例联系。

请注意,这实际上使容器root可以访问主机级!我敢肯定,还有更多的方法可以做到这一点,但是方法2是我最常看到的方法。

如果您打算在另一个已经运行的Docker容器中运行另一个可执行文件,则也可以使用docker exec以上述方式执行此操作,或者在第二个接受命令的容器中运行某种守护程序,为您运行所需的命令。

答案 1 :(得分:0)

因此,您需要将容器视为两个独立的计算机或服务器,并且它们可以进行相应的交互。

很高兴,docker-compose为您提供了一个URL,可用于在容器之间进行通信。对于docker-compose文件,您可以从py容器访问winexe容器,如下所示:

http://winexe:8001 // or ws://winexe:8001 or postgres://winexe:8001 (you get the idea)

(我在这里使用了端口8001,因为这是您为winexe提供的端口–我不知道它是否可以用于此)。

现在,您需要的是winexe容器中的内容,而不是监听该信号并发送有用的答复(例如浏览器向服务器发送ajax调用)

在此处了解更多信息:

https://docs.docker.com/compose/networking/