使用EB CLI运行本地Java / mysql容器堆栈会返回:nc:错误的地址“ mysql-server”

弗朗西斯科·汉纳

因此,我有一个docker-compose包含2个容器堆栈:一个MySQL5.7服务器和一个连接到MySQL服务器的Spring Boot应用程序。

最终,我想在Elastic Beanstalk中的Multi Docker Container环境中部署此堆栈。

但是首先是第一件事。我为堆栈编写了以下Docker Compose文件:

docker-compose.yml

version: '3'

services:
  mysql-server:
    container_name: mysql-server-container
    image: mysql/mysql-server:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: packages
      MYSQL_USER: user
      MYSQL_PASSWORD: test
      MYSQL_ROOT_HOST: '%'
    restart: always

  saver:
    container_name: saver-poc-container
    image: travelpaq1/saver-poc:latest
    ports:
      - 3000:8080
    environment:
      DB_HOST: jdbc:mysql://mysql-server
      DB_USER: user
      DB_PASSWORD: test
    depends_on:
      - mysql-server

mysql-server服务使用官方的MySQL5.7 docker映像,并且该saver服务的映像如下:

保护程序Dockerfile

FROM openjdk:8-jdk-alpine
VOLUME /tmp
RUN apk add --no-cache bash
COPY wait-for-it.sh wait-for-it.sh
RUN chmod +x wait-for-it.sh
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["./wait-for-it.sh", "--timeout=60",  "mysql-server:3306", "--", "java", "-jar", "app.jar"]

您可能会注意到,我正在使用wait-for-it命令来等待数据库容器完全初始化,然后再启动应用程序容器。

因此,如果我运行,docker-compose up一切正常!

现在是问题所在:如前所述,我想在Elastic Beanstalk的Multi Docker Container环境中运行此堆栈。Elastic Beanstalk不支持使用Docker Composer文件进行部署,而是使用名为的文件Dockerrun.aws.json我使用container-transform来获取一个Dockerrun.aws.json等效于我文件docker-compose.yml文件本身如下:

{
    "AWSEBDockerrunVersion": 2,
    "containerDefinitions": [
        {
            "environment": [
                {
                    "name": "MYSQL_ROOT_PASSWORD",
                    "value": "root"
                },
                {
                    "name": "MYSQL_DATABASE",
                    "value": "packages"
                },
                {
                    "name": "MYSQL_USER",
                    "value": "user"
                },
                {
                    "name": "MYSQL_PASSWORD",
                    "value": "test"
                },
                {
                    "name": "MYSQL_ROOT_HOST",
                    "value": "%"
                }
            ],
            "essential": true,
            "image": "mysql/mysql-server:5.7",
            "name": "mysql-server"
        },
        {
            "environment": [
                {
                    "name": "DB_HOST",
                    "value": "jdbc:mysql://mysql-server"
                },
                {
                    "name": "DB_USER",
                    "value": "user"
                },
                {
                    "name": "DB_PASSWORD",
                    "value": "test"
                }
            ],
            "essential": true,
            "image": "travelpaq1/saver-poc:latest",
            "name": "saver",
            "portMappings": [
                {
                    "containerPort": 8080,
                    "hostPort": 3000
                }
            ]
        }
    ],
    "family": "",
    "volumes": []
}

EB CLI支持与本地运行的堆栈eb local run但是当我运行它时,我得到以下日志:

Creating elasticbeanstalk_mysqlserver_1 ... done
Creating elasticbeanstalk_saver_1       ... done
Attaching to elasticbeanstalk_mysqlserver_1, elasticbeanstalk_saver_1
mysqlserver_1  | [Entrypoint] MySQL Docker Image 5.7.26-1.1.11
saver_1        | wait-for-it.sh: waiting 60 seconds for mysql-server:3306
saver_1        | nc: bad address 'mysql-server'
mysqlserver_1  | [Entrypoint] Initializing database
saver_1        | nc: bad address 'mysql-server'
saver_1        | nc: bad address 'mysql-server'
saver_1        | nc: bad address 'mysql-server'
saver_1        | nc: bad address 'mysql-server'
saver_1        | nc: bad address 'mysql-server'
mysqlserver_1  | [Entrypoint] Database initialized
mysqlserver_1  | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
mysqlserver_1  | Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
saver_1        | nc: bad address 'mysql-server'
mysqlserver_1  | Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
mysqlserver_1  | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
mysqlserver_1  | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
mysqlserver_1  | 
mysqlserver_1  | [Entrypoint] ignoring /docker-entrypoint-initdb.d/*
mysqlserver_1  | 
saver_1        | nc: bad address 'mysql-server'
mysqlserver_1  | [Entrypoint] Server shut down
mysqlserver_1  | 
mysqlserver_1  | [Entrypoint] MySQL init process done. Ready for start up.
mysqlserver_1  | 
mysqlserver_1  | [Entrypoint] Starting MySQL 5.7.26-1.1.11
saver_1        | nc: bad address 'mysql-server'
saver_1        | nc: bad address 'mysql-server'
...

而且它一直在打印

saver_1        | nc: bad address 'mysql-server'

最后,“等待等待”超时到期,并且保护程序应用程序无法启动,因为它无法连接到数据库。

如您所见,数据库服务容器已初始化,wait-for-it似乎开始起作用,但是该saver_1服务无法解析mysql-server与数据库服务容器相对应地址(我猜它是指mysql-server:3306等待它尝试尝试的地址测试)

那么,可能是什么问题呢?如何使应用程序服务容器解析数据库服务容器URL?我对Elastic Beanstalk中的Multi Docker Container环境不太熟悉。

弗朗西斯科·汉纳

就我而言,这只是一个愚蠢的错误。

我缺少应用容器links的容器定义中属性,saver以允许容器彼此“交谈”,如下所示:

"links": [
    "mysql-server"
],

我可以删除该问题,但作为在Elastic Beanstalk中部署Docker堆栈的摘要,它可能很有用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章