我對 Docker 很陌生,我已經嘗試了所有我能想到的并且已經絕望了。我真的希望你們中的一個人知道可能會發生什么。我正在做一個專案,我使用 Jenkins 和 Docker 創建了一個 CI 管道。
我用 spring.datasource.url 嘗試了很多東西。
- 使用名稱“db”,因為這就是服務在 docker-compose.yml 中的名稱
- 使用 grep 查找我的 docker0 服務、我的 docker 容器等的 IP 地址。
- 按原樣嘗試 localhost
- 在 docker-compose 檔案中嘗試不同的環境變數。(使用用戶名和密碼,而不是使用它。)
- 嘗試環境變數。我不記得確切的格式,但它是這樣的: jdbc:mysql://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}?createDatabaseIfNotExist=true&useSSL=false
- 試圖在 EC2 機器上安裝 mysql。
- 許多其他事情(今晚嘗試 30 次,昨晚大約 60 次)。如果它在stackoverflow上,我可能嘗試過。
作為一個菜鳥,我很可能只是不知道一些非常基本的東西。老實說,我即將放棄并嘗試使用 H2 資料庫運行它。我希望這會更容易,但我仍然抱有一絲希望,這可能會有所幫助。
我的專案在我的 spring.datasource.url 中使用 localhost 在我的本地機器上運行。
mysql 上的 localhost 成功
然而,在 EC2 上,我收到了“拒絕連接”錯誤的變體。
碼頭工人悲傷的時光
在 spring-boot 中,我得到與這些類似的錯誤:
- 如果我在主機的連接字串中嘗試硬編碼名稱:
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[na:na]
at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source) ~[na:na]
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.27.jar!/:8.0.27]
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) ~[mysql-connector-java-8.0.27.jar!/:8.0.27]
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) ~[mysql-connector-java-8.0.27.jar!/:8.0.27]
at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) ~[mysql-connector-java-8.0.27.jar!/:8.0.27]
at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) ~[mysql-connector-java-8.0.27.jar!/:8.0.27]
at com.mysql.cj.NativeSession.connect(NativeSession.java:120) ~[mysql-connector-java-8.0.27.jar!/:8.0.27]
at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:948) ~[mysql-connector-java-8.0.27.jar!/:8.0.27]
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:818) ~[mysql-connector-java-8.0.27.jar!/:8.0.27]
... 57 common frames omitted
Caused by: java.net.UnknownHostException: db
at java.base/java.net.InetAddress$CachedAddresses.get(Unknown Source) ~[na:na]
at java.base/java.net.InetAddress.getAllByName0(Unknown Source) ~[na:na]
at java.base/java.net.InetAddress.getAllByName(Unknown Source) ~[na:na]
at java.base/java.net.InetAddress.getAllByName(Unknown Source) ~[na:na]
at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:133) ~[mysql-connector-java-8.0.27.jar!/:8.0.27]
at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) ~[mysql-connector-java-8.0.27.jar!/:8.0.27]
... 60 common frames omitted
我得到的最接近的是在主機插槽中使用類似于以下的 IP 地址:
jdbc:mysql://172.17.0.0:3306/foodboxdb?createDatabaseIfNotExist=true&useSSL=false
我嘗試了 172.17.0.0, 172.18.0.2,172.18.0.3 基于我所知道的一點點尋找:
使用 docker 檢查
ec2 根上的路由
這種方法會超時,所以再一次,沒有作業 - 但沒有像其他人那樣給出明顯的失敗錯誤,它會說密碼錯誤或主機錯誤。
我確實找到了一條評論,說有人以某種方式更改了他們的 RUN 命令:
java -Dspring.profiles.active=dockerembbed,oauth-security -jar myapp.jar
但是我的命令的格式非常不同,我不能 100% 確定如何嘗試將該命令放入我的 Dockerfile。這就是我現在所擁有的:
ENTRYPOINT ["java","-jar","foodbox-service-rest-0.0.1-SNAPSHOT.jar"]
如果有人知道這個人對命令做了什么-Dspring.profiles.active=dockerembbed以及將其放入 ENTRYPOINT 命令的正確方法,我很樂意看到它。
無論如何,下面是我的代碼。我很確定這是所有相關的東西。我的 github 倉庫在這里:https ://github.com/samparsons/pg6-backend
提前謝謝你 - 我真的不知道現在還能嘗試什么!
我的 application.properties 檔案如下所示:
# Application Properties
server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/foodoxdb?createDatabaseIfNotExist=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.defer-datasource-initialization=true
spring.jpa.hibernate.ddl-auto=create
spring.jpa.database=mysql
spring.jpa.show-sql=true
我的 Jenkinsfile 看起來像這樣:
pipeline {
agent any
triggers {
pollSCM('* * * * *')
}
stages {
stage('Docker compose build') {
steps {
echo '----------------- This is a docker-compose phase ----------'
sh 'docker-compose up -d --force-recreate --remove-orphans --build'
}
}
}
}
我的 docker-compose.yml 檔案如下所示:
version: '3.8'
services:
db:
image: mysql:8
environment:
- MYSQL_ROOT_PASSWORD=
- MYSQL_DATABASE=foodboxdb
- MYSQL_USER=root
- MYSQL_PASSWORD=pw
restart: always
ports:
- 3306:3306
volumes:
- foodboxdb:/var/lib/mysql
foodbox-service-rest:
container_name: foodbox-service-rest
restart: on-failure
image: foodbox-service-rest
build:
context: ./
dockerfile: Dockerfile
depends_on:
- db
ports:
- 8081:8081
environment:
- DATABASE_HOST=db
- DATABASE_USER=root
- DATABASE_PASSWORD=pw
- DATABASE_NAME=foodboxdb
- DATABASE_PORT=3306
volumes:
foodboxdb:
最后我的 Dockerfile 看起來像這樣:
# code below is from medium tutorial by Wynn Teo,
https://medium.com/geekculture/dockerizing-a-spring-boot-application-with-maven-122286e9f582
# it has been modified slightly for my use case.
# AS <NAME> to name this stage as maven
FROM maven:3.6.3 AS maven
RUN echo "jenkins ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
EXPOSE 8081
EXPOSE 3306
WORKDIR /usr/src/app
COPY . /usr/src/app
# Compile and package the application to an executable JAR
RUN mvn package -DskipTests
RUN echo "running in root"
RUN ls
RUN echo "running in /usr/src/app"
RUN ls /usr/src/app
RUN echo "running in /usr/src/app/target"
RUN ls /usr/src/app/target
# For Java 11,
FROM adoptopenjdk/openjdk11:alpine-jre
ARG JAR_FILE=foodbox-service-rest-0.0.1-SNAPSHOT.jar
WORKDIR /opt/app
# Copy the foodbox-service-rest-0.0.1-SNAPSHOT.jar from the maven stage to the /opt/app directory of the current stage.
COPY --from=maven /usr/src/app/target/${JAR_FILE} /opt/app/
ENTRYPOINT ["java","-jar","foodbox-service-rest-0.0.1-SNAPSHOT.jar"]
uj5u.com熱心網友回復:
我讓它作業。這是我為解決這個問題所做的。
- 確保 docker-compose 運行了我想要運行的服務。如果您定義了需要運行的服務,它將首先創建所有依賴項。因此,我將命令從更改
docker-compose up -d --force-recreate --remove-orphans --build
為
docker-compose up -d --force-recreate --remove-orphans --build <PUT_SERVICE_NAME_HERE>
以下是我在 docker-compose 幫助檔案中閱讀的內容,它給了我這個提示:https ://docs.docker.com/compose/compose-file/compose-file-v2/#取決于 - 完成此操作后,我在運行
docker ps -a以觀察容器狀態時注意到我遇到了一個新問題 - 我的資料庫不斷重新啟動。顯然,如果資料庫關閉,該服務將無法作業。因此,為了進行故障排除,我發現您可以使用以下命令在 Docker 中獲取容器日志:docker logs -f <db_container_name>
使用此命令,我能夠弄清楚如何為我的資料庫設定“讓它作業”。請注意 - 不要復制我的環境設定,這太糟糕了!我真的只需要它來作業,這樣我就可以完成我的專案。由于這是針對學校的,他們沒有誠實地對安全性甚至最佳實踐進行評分(這個程式充其量是有問題的!)。 - 最后,一旦資料庫開始作業,我就切換回這里顯示的 spring.datasource.url 格式:
jdbc:mysql://db:3306/foodboxdb?createDatabaseIfNotExist=true&useSSL=false使用 db 作為資料庫名稱,這是我在 docker-compose.yml 檔案中啟動的 db 服務的名稱.
隨意重復使用我的回購與上述警告。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/428321.html
