栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何配置在AWS / ElasticBeanstalk / Docker上运行的GlassFish实例?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何配置在AWS / ElasticBeanstalk / Docker上运行的GlassFish实例?

接下来是对我有用的东西-但我感觉自己缺少一些东西。任何编辑/评论都将受到欢迎。

EB /
Docker部署中有各种挂钩,允许执行部署后挂钩在EB实例的docker容器内的glassfish实例中运行。我使用了部署后挂钩来建立连接池。这是最终安装的样子,仅供参考:

|  | |  _WAR_/  | | ||  | _Glassfish_/ | ||  ____Docker____/  |____EC2 Instance____/

总体期望的结果是,在部署应用程序之后,在Docker实例内部,运行 asadmin
命令以创建JDBC连接池,并将该连接池转换为jdbc资源。在我的本地计算机上,命令是

asadmin create-jdbc-connection-pool     --datasourceclassname org.postgresql.ds.PGConnectionPoolDataSource     --restype javax.sql.ConnectionPoolDataSource     --property user=USERNAME:password=PASSWORD:serverName=DBHOST:portNumber=5432:databaseName=DBNAME     poolNameasadmin create-jdbc-resource --connectionpoolid poolName jdbc/dev

其中“ jdbc / dev”是java代码以常规方式获取连接所需的名称,即

InitialContext ctx = new InitialContext();ds = (DataSource)ctx.lookup("jdbc/dev");

我们希望命令在docker实例中运行,因为docker实例可以访问您在AWS管理控制台中声明的环境变量,因此我可以传递配置信息,而无需在构建脚本中使用它。

为实现此结果,我们要求在安装过程中在EC2实例中创建一个文件,在我的情况下为
/opt/elasticbeanstalk/hooks/appdeploy/post/99_configure_jdbc.sh
。此文件将在EC2实例中作为根用户在部署后执行。我将其称为 ec2-post-deploy-hook

我们将使用.ebextensions / .config文件创建该文件,如此处所述

  • http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers.html
  • http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html

我的.config文件具有以下内容:

files:  "/opt/elasticbeanstalk/hooks/appdeploy/post/99_configure_jdbc.sh":    mode: "000755"    owner: root    group: root    content: |      #!/bin/bash      date > /tmp/post 2>&1      dockerid=`docker ps | grep latest | cut -d" " -f1`      echo $dockerid >> /tmp/post 2>&1      docker ps >> /tmp/post 2>&1      docker exec $dockerid /var/app/WEB-INF/classes/setup_pool.sh >> tmp/post 2>&1

内容 之后的所有 内容: 最终出现在 ec2-post-deploy-hook中

我从http://junkheap.net/blog/2013/05/20/elastic-beanstalk-post-deployment-
scripts了解了这个想法。

仅需要最后一行和最后第四行,但其他行对于调试很有用。输出最终在EC2实例上的/ tmp / post中。

该文件中的一个技巧是,我们总是可以通过以下方式获取Docker容器的ID:

sudo docker ps | grep latest | cut -d" " -f1

因为部署后将仅运行一个Docker容器,并且其名称将为“ latest”。

ec2-post-deploy-hook 的最后一行使用docker在docker实例内部运行我最初想要运行的命令-
即asadmin命令。我在.war文件中部署了一个名为setup_pool.sh的文件,因此该文件最终在部署过程中位于已知位置。我的setup_pool.sh看起来像这样(我称之为
docker-post-deploy-hook ):

dbuser=$PARAM1dbpass=$PARAM2dbhost=$PARAM3dbname=$PARAM4date > /tmp/setup_connectionsecho '*********' >> /tmp/setup_connectionsasadmin create-jdbc-connection-pool --datasourceclassname org.postgresql.ds.PGConnectionPoolDataSource --restype javax.sql.ConnectionPoolDataSource --property user=${dbuser}:password=${dbpass}:serverName=${dbhost}:portNumber=5432:databaseName=${dbname} ei-connection-pool >>   /tmp/setup_connections 2>&1echo '*********' >> /tmp/setup_connectionsasadmin create-jdbc-resource --connectionpoolid ei-connection-pool jdbc/dev >> /tmp/setup_connections 2>&1echo '*********' >> /tmp/setup_connections

该文件在docker实例中运行。这两个 asadmin 命令很重要,但同样,在docker实例中对/ tmp /
setup_connections进行了一些调试

密码等是从AWS环境获得的。

此时,我唯一不能做的就是在首次部署时使用AWS环境变量。我不知道为什么,但是我似乎只能在实例启动并运行后对其进行设置。这意味着我必须部署两次,分别是虚拟部署,环境编辑和真实部署。

所以总结一下

  • 部署时
    • .config文件会生成ec2-post-deploy-hook文件,
    • AWS系统将docker-post-deploy-hook部署为部署到glassfish的.war的一部分
  • 在部署后,
    • 弹性beantalk系统运行ec2-post-deploy-hook
    • ec2-post-deploy-hook运行docker-post-deploy-hook
    • docker-post-deploy-hook以管理员身份运行以设置适当的连接池
  • 在运行时,Web应用程序中的Java代码会利用连接池

而且一切正常。看得出来这有点丑陋,但是,我也是。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/415524.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号