Payara Docker数据源连接问题



我开发了一个简单的JAKARTAEE web应用程序,并使用netbeans将其部署到payara。我已经通过docker建立了一个mysql数据库,它运行良好。现在我尝试使用docker-compose.yml文件来设置mysql和payara服务器。问题是,当我试图将我的payara服务器容器化时,我似乎无法访问数据库。。。

我的docker-compose.yml看起来如下:

version: '3'
services:
docker-mysql:
container_name: docker-mysql
restart: always
image: mysql:8
environment:
MYSQL_DATABASE: helloworld
MYSQL_ROOT_PASSWORD: snoopy
MYSQL_ROOT_HOST: '%'
MYSQL_USER: snoopy
MYSQL_PASSWORD: snoopy
expose:
- "3306"
ports:
- "3306:3306"
networks:
- backend
helloworld-javaee-app:
container_name: helloworld-javaee-app
restart: on-failure
build: ./
expose:
- "8080"
- "4848"
ports:
- "8080:8080"
- "4848:4848"
environment:
DATASOURCE_URL: jdbc:mysql://docker-mysql:3306
DATASOURCE_USERNAME: root
DATASOURCE_PASSWORD: snoopy
DATASOURCE_DATABASE: helloworld
depends_on:
- docker-mysql
networks:
- backend
networks:
backend:

我的Dockerfile看起来如下:

#
# Build stage
#
FROM maven:3.6.0-jdk-11-slim AS build
WORKDIR /
COPY . /home/app
RUN mvn -f /home/app/pom.xml clean package
#
# Package stage
#
FROM payara/server-full
COPY --from=build /home/app/target/*.war $DEPLOY_DIR

my persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="payaraHibernate" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:app/jdbc/hibernate</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="create" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/>
</properties>
</persistence-unit>
</persistence>

my-glassfish-resources.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
<jdbc-resource enabled="true" 
pool-name="MySQLPool" 
jndi-name="java:app/jdbc/hibernate"/>
<jdbc-connection-pool name="MySQLPool" 
res-type="javax.sql.DataSource" 
datasource-classname="com.mysql.cj.jdbc.MysqlDataSource">
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://docker-mysql:3306"/>
<property name="UseSSL" value="false"></property>
<property name="User" value="root"></property>
<property name="Password" value="snoopy"></property>
<property name="DatabaseName" value="helloworld"></property>
<property name="AllowPublicKeyRetrieval" value="true"></property>
</jdbc-connection-pool>
</resources>

有人面临类似的事情吗?我似乎找不到为什么payara无法访问docker mysql。。。

错误:

| Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

网络检查:

[
{
"Name": "helloworld_backend",
"Id": "0b79d93b27d8c1f51763c4fea90ae9b73fffce7ec0d26fab5d7f1769c3acbf92",
"Created": "2021-04-30T23:00:18.7217142Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.30.0.0/16",
"Gateway": "172.30.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"2dfa3cadc424323cfdc8ea657db11f9bf4fb58ea44303711c5e8a97b6bb618bf": {
"Name": "helloworld-javaee-app",
"EndpointID": "9da38f596bcbeafecd34b36d5686aff7cfc6319ce75cdb3519eb891d8f2ed210",
"MacAddress": "02:42:ac:1e:00:03",
"IPv4Address": "172.30.0.3/16",
"IPv6Address": ""
},
"e470e2d587ca417d4cbcffc7c038858cf51892274c5c534a088c11a47e8dc566": {
"Name": "docker-mysql",
"EndpointID": "e0ef57640d48520b616b6d314bd7306d69ec89efd89a0dba86dfcc3113248445",
"MacAddress": "02:42:ac:1e:00:02",
"IPv4Address": "172.30.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "backend",
"com.docker.compose.project": "helloworld",
"com.docker.compose.version": "1.29.0"
}
}
]

将glassfish-resources.xml更改为payara-resources.xml,并将文件内容更改为:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Payara.fish//DTD Payara Server 4 Resource Definitions//EN" "https://raw.githubusercontent.com/payara/Payara-Server-Documentation/master/schemas/payara-resources_1_6.dtd">
<resources>
<jdbc-resource enabled="true" 
pool-name="MySQLPool" 
jndi-name="java:app/jdbc/hibernate"/>
<jdbc-connection-pool name="MySQLPool" 
res-type="javax.sql.DataSource" 
datasource-classname="com.mysql.cj.jdbc.MysqlDataSource">
<property name="URL" value="jdbc:mysql://docker-mysql:3306/helloworld"/>
<property name="UseSSL" value="false"></property>
<property name="User" value="snoopy"></property>
<property name="Password" value="snoopy"></property>
<property name="AllowPublicKeyRetrieval" value="true"></property>
</jdbc-connection-pool>
</resources>

它奏效了。。。把它留给遇到同样问题的人。我认为问题出在根用户身上,尽管我将MYSQL_root_HOST指定为%

最新更新