以下是對我有用的東西 - 但我有一種感覺我失去了一些東西。任何編輯/評論將是最受歡迎的。
EB/Docker部署中有各種鉤子允許在EB實例內的docker容器內的glassfish實例中執行部署後掛鉤。我使用部署後掛鉤來設置連接池。下面是最後安裝的樣子,僅供參考:
| | | \_WAR_/ | | |
| | \_Glassfish_/ | |
| \____Docker____/ |
\____EC2 Instance____/
所需的總的結果是,應用程序部署後,泊塢窗實例裏面,的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
poolName
asadmin create-jdbc-resource --connectionpoolid poolName jdbc/dev
哪裏JDBC的/ dev'是java的代碼需要知道獲得即
InitialContext ctx = new InitialContext();
ds = (DataSource)ctx.lookup("jdbc/dev");
我們希望以通常的方式連接的名稱因爲docker實例可以訪問您在AWS管理控制檯中聲明的環境變量,所以我可以傳遞配置信息,而不必在構建腳本中傳遞配置信息。
爲了實現這一結果,我們需要一個文件,在安裝過程中的EC2實例創建的,在我的情況被稱爲/opt/elasticbeanstalk/hooks/appdeploy/post/99_configure_jdbc.sh。該文件將在EC2實例中以root身份部署後執行。我將其稱爲ec2-post-deploy-hook。
我們要創建使用.ebextensions/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。
在該文件中的一個訣竅是,我們總是可以通過
sudo docker ps | grep latest | cut -d" " -f1
得到泊塢窗容器的ID,因爲部署後只會有一個碼頭工人的容器中運行,它會「最新」的其名稱。
ec2-post-deploy-hook的最後一行使用docker在docker實例中運行我最初想要運行的那些命令 - 即asadmin命令。我在我的.war文件中部署名爲setup_pool.sh的文件,因此它在部署過程中會在已知位置結束。我setup_pool.sh看起來像這樣(我稱之爲泊塢窗,後部署鉤):
dbuser=$PARAM1
dbpass=$PARAM2
dbhost=$PARAM3
dbname=$PARAM4
date > /tmp/setup_connections
echo '*********' >> /tmp/setup_connections
asadmin 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>&1
echo '*********' >> /tmp/setup_connections
asadmin create-jdbc-resource --connectionpoolid ei-connection-pool jdbc/dev >> /tmp/setup_connections 2>&1
echo '*********' >> /tmp/setup_connections
這個文件是在泊塢窗實例中運行。這兩個asadmin命令是肉食,但同樣,在docker實例中有一些調試進入/ tmp/setup_connections
密碼等是從AWS環境獲得的。
我現在唯一不能做的就是在首次部署時提供AWS環境變量。我不知道爲什麼,但我似乎只能在實例啓動並運行後設置它們。這意味着我必須部署兩次虛擬部署,然後進行環境編輯,然後進行真正的部署。
因此,在部署總結,
-
- 一個config文件生成一個EC2-後部署掛機文件,
- 的AWS系統部署-deploy-泊塢窗,後鉤作爲被部署到Glassfish的
- 在後部署的.war的一部分,
- 彈性beanstalk系統運行ec2-post-deploy-hook
- ec2-post-deploy-hook運行docker-post-deploy-hook
- docker-post-deploy-hook運行asadmin來設置適當的連接池
- 在運行時,在Web應用程序中的Java代碼利用了連接池
而這一切的作品。看起來有點難看,但是,你知道,我也是。
請發佈您的docker ps響應(您可以混淆IP),如果可能的話您的aws docker json清單文件。 – 2014-12-08 15:30:40
Hi Usman。恐怕我不知道aws docker son manifest文件是什麼。 (我現在懷疑是我的問題......) – 2014-12-08 20:54:49
我的意思是Dockerrun.aws.json文件。 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker_image.html – 2014-12-08 20:56:23