如何使用Docker Compose从另一个容器使用命令?

如何使用Docker Compose从另一个容器使用命令?,docker,docker-compose,dockerfile,adonis.js,Docker,Docker Compose,Dockerfile,Adonis.js,我有两个DockerFile:一个用于adonis(具有节点docker的中心映像),另一个用于mongo(具有mongodocker的中心映像) mongo_服务必须依赖于adonis服务,因为我只想在启动所有mongo实例后运行adonis 因此,在mongo dockerfile的末尾,我运行了一个脚本,该脚本最终将运行: adonis seed adonis serve 我遇到的错误是:未找到adonis:command 我知道mongo_服务无法访问安装了adonis的adonis_

我有两个DockerFile:一个用于adonis(具有节点docker的中心映像),另一个用于mongo(具有mongodocker的中心映像)

mongo_服务必须依赖于adonis服务,因为我只想在启动所有mongo实例后运行adonis

因此,在mongo dockerfile的末尾,我运行了一个脚本,该脚本最终将运行:

adonis seed
adonis serve
我遇到的错误是:未找到adonis:command

我知道mongo_服务无法访问安装了adonis的adonis_服务

我的问题是如何访问我安装在另一个容器中的东西?我这样做是为了使工作更有条理

version: '3'
services:
  mongo_service:
    build:
      context: .
      dockerfile: docker_mongo_context/Dockerfile
    tty: true
    hostname: mongo
    ports:
      - "27017:27017"
    depends_on:
          - adonis_service
  adonis_service:
    build:
      context: .
      dockerfile: docker_adonis_context/Dockerfile
    tty: true
    hostname: adonis
    ports:
      - "3333:3333"
    volumes:
      - .:/app

对于那些对如何使用
ssh
感兴趣的人,我添加了一个小示例,它允许在容器之间使用
ssh
,而无需

  • 处理用于身份验证的密码
  • 向外部环境或主机公开私钥/公钥
  • 从外部访问(只有同一docker网络中的docker容器可以访问)

描述
docker compose.yml
docker编写
文件。它由一些配置组成

  • 我已经分配了我的容器静态IP,这使得访问更加容易
  • 我添加了一个卷(
    sshdata
    ),用于在容器之间共享ssh密钥(用于身份验证)
  • 版本:“3.8”
    服务:
    第一次服务:
    建造:
    上下文:。
    dockerfile:dockerfile-1
    网络:
    vpcbr:
    ipv4_地址:10.5.0.2
    环境:
    -二次维修=10.5.0.3
    卷数:
    -sshdata:/home/developer/.ssh/
    第二项服务:
    建造:
    上下文:。
    dockerfile:dockerfile-2
    网络:
    vpcbr:
    ipv4_地址:10.5.0.3
    卷数:
    -sshdata:/home/developer/.ssh/
    取决于:
    -第一次服务
    网络:
    vpcbr:
    司机:驾驶台
    ipam:
    配置:
    -子网:10.5.0.0/16
    卷数:
    sshdata:
    
    码头文件 服务的DockerFile是相同的,只有
    entrypoint.sh
    -脚本不同(见下文)

    入口点脚本 现在我们来看重要的东西:
    entrypoint.sh
    -脚本,它执行所需的设置步骤。我们的第一个容器(
    first service
    )应该能够
    ssh
    到我们的第二个容器(
    second service

    为此,我们的首次服务没有特殊设置。我们只需将
    ~/.ssh
    文件夹的所有者更改为对
    ~/.ssh/known_hosts
    具有写入权限(但如果不想执行此操作,可以禁用严格的主机密钥检查)

    #/bin/bash
    #服务第一服务的入口点
    #我们现在可以ssh到另一个容器
    #更改.ssh文件夹的所有者及其内容
    sudochown-R开发者:开发者~/.ssh
    #执行你的命令
    虽然ssh keyscan-H${SECOND\u SERVICE}>>~/.ssh/known\u主机
    做
    echo“主机未启动,请重试…”
    睡眠1;
    完成
    # -------------------------------------
    #在这里,我们可以运行我们的命令
    ssh开发者@${SECOND_SERVICE}“ls-l/”
    回声“完成!”
    # -------------------------------------
    #在这里你可以做其他事情
    tail-f/dev/null
    
    一条引人注目的线路是while循环:我们不知道第二个服务何时准备好ssh连接。我们可以等,但那不是很优雅。相反,我们会定期尝试连接到第二个容器,直到命令成功。之后,它将继续执行实际命令

    最后是第二个服务的
    entrypoint.sh
    -脚本:

    #/bin/bash
    #第二次服务的入口点
    ##--ssh的一点设置
    #启动服务器
    sudo服务ssh启动
    #生成密钥
    sudo ssh keygen-t rsa-f/home/developer/.ssh/id\u rsa
    #更改.ssh文件夹的所有者及其内容
    sudochown-R开发者:开发者~/.ssh
    #添加键
    sudo echo$(cat/home/developer/.ssh/id\u rsa.pub)>~/.ssh/authorized\u密钥
    # -------------------------------------
    #我们可以开始做这些事情了
    tail-f/dev/null
    

    也许这对某人有帮助。

    我现在能想到的唯一方法是
    ssh
    到另一个容器中执行命令。这对您有用吗?我可以问一下如何启动您的容器吗?通常docker compose会在compose文件中为图像创建一个默认网络。是的@agentsmith,这可能会解决您的问题吗?
    FROM ubuntu:latest
    
    # We need some tools
    RUN apt-get update && apt-get install -y ssh sudo net-tools
    # We want to have another user than `root`
    RUN adduser developer
    
    ## USER SETUP 
    # We want to have passwordless sudo access
    RUN \
        sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
        sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
        sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
        echo "developer ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers;  su - developer -c id
    
    # Run now with user developer
    USER developer
    ADD ./entrypoint-1.sh /entrypoint-1.sh
    RUN sudo chmod +x /entrypoint-1.sh
    
    ENTRYPOINT [ "/entrypoint-1.sh" ]