Docker compose can';不得进入其他集装箱的港口

Docker compose can';不得进入其他集装箱的港口,docker,shell,networking,docker-compose,Docker,Shell,Networking,Docker Compose,我有两个容器与docker compose一起运行。其中一个容器正在执行shell脚本,该脚本应检查另一个容器是否已启动并正在端口9990上运行 即使容器正在启动,shell脚本也不会响应任何内容 keycloak: image: jboss/keycloak:latest volumes: - ./imports/cache_reload/disable-theme-cache.cli:/opt/jboss/startup-scripts/dis

我有两个容器与docker compose一起运行。其中一个容器正在执行shell脚本,该脚本应检查另一个容器是否已启动并正在端口9990上运行

即使容器正在启动,shell脚本也不会响应任何内容

   keycloak:
      image: jboss/keycloak:latest
      volumes: 
        - ./imports/cache_reload/disable-theme-cache.cli:/opt/jboss/startup-scripts/disable-theme-cache.cli
        - ./imports/themes/custom/:/opt/jboss/keycloak/themes/custom-theme/
        - ./imports/realm/realm-export.json:/opt/jboss/realms/custom-import.json
      environment:
        DB_VENDOR: MYSQL
        DB_ADDR: mysql
        DB_DATABASE: keycloak
        DB_USER: keycloak
        DB_PASSWORD: password
        KEYCLOAK_USER: admin
        KEYCLOAK_PASSWORD: Pa55w0rd
      ports:
        - 8080:8080
      depends_on:
        - mysql
  keycloak_installer:
    image: solr:6.6-alpine
    volumes:
      - ./imports/scripts/import-realm.sh:/docker-entrypoint-initdb.d/init.sh
    depends_on: 
      - keycloak
shell脚本如下所示:

echo "MOIN LEUDE TRYMACS HIER!"

while ! nc -z localhost 9990; do
    sleep 1
    echo "Waiting for keycloak server startup 9990..."

    echo "$(nc -z localhost 9990)"
done
第一个回音被打印出来,但是其他的什么都不打印

容器KeyClope正在端口9990上运行

请帮助,谢谢

您必须在docker compose中理解

要解决您的问题,您需要:

  • 在docker compose文件中为每个容器添加网络(有一个默认网络,但要了解其机制,可以明确定义它)。对于第一个容器(名为keybeapt),它必须如下所示(例如在端口下):
  • 端口:
    - 8080:8080  
    网络:
    -密钥掩蔽网络
    
    在第二个容器(名为keydove_installer)上(必须公开要在第一个容器中请求的端口):

    取决于:
    -钥匙斗篷
    网络:
    -密钥掩蔽网络
    
  • 在您的脚本上,显式地调用第二个容器,该容器现在将由网络提供。您必须通过以下方式更改代码:
  • nc-z钥匙斗篷安装程序9990
    
    从“安装程序”容器的角度来看,
    localhost
    是“安装程序”容器。有关可连接到其他容器的主机名,请参见;您应该能够使用Compose服务名
    keydape
    作为主机名。我已经试过了!nc-z键斗篷9990;还是一样。有什么想法吗?谢谢!您不需要执行步骤1中的任何部分。Compose创建一个
    默认值
    网络,如果不执行任何操作,则将容器附加到该网络;“expose”作为动词在现代Docker中几乎没有任何意义;容器间连接完全忽略
    端口:
    。感谢您的反馈。我已经编辑了我的答案,我想明确定义网络更容易理解。对于端口,您是对的,只是为了测试,但这不是必需的,我已经删除了它。