Dockerize spring boot app with mysql
Chào mọi người mình đang gặp một số thắc mắc như sau Mình có 2 file Dockerfile với docker-compose.yml như sau:
Dockerfile
FROM maven:3.8.7-eclipse-temurin-17
WORKDIR /app
COPY . .
RUN mvn clean install
CMD mvn spring-boot:run
**docker-compose.yml **
version: "3.1"
services:
server:
build: .
restart: always
container_name: server
ports:
- "8080:8080"
depends_on:
- db
db:
image: mysql:8-debian
container_name: mysql
command: --authentication_policy="*,,"
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "123456aA@$"
MYSQL_DATABASE: "Project"
MYSQL_USER: "user"
MYSQL_PASSWORD: "123456aA@$"
ports:
- "3306:3306"
volumes:
- "./mysql/db:/var/lib/mysql"
- "./init.sql:/docker-entrypoint-initdb.d/init-script.sql"
Khi mình chạy docker compose up thì bị lỗi mình đoán là do khi nó chạy mvn install
bị lỗi do cái service mysql
nó chưa chạy nên lỗi
Trên máy của mình cũng có đã có cài Maven
nên mình thử chạy mvn install
mà không chạy mysql
Còn khi mình thử chạy mỗi service mysql
thì mình chạy mvn install
thì 100% success
Mình có thắc mắc là làm sao để thằng maven install
chạy sau khi sercvice db
chạy?
Mình có thấy trên mạng trong Dockerfile
là chạy thông qua java -jar
nhưng mà như thế này thì phải có maven sắn trên máy mới chạy được (mình không muôn muốn kiểu này)
Mong được sự giúp đỡ cửa mọi người
Update Anwser
Dockerfile
FROM maven:3.8.3-openjdk-17-slim AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=build /app/target/BEProject-0.0.1-SNAPSHOT.jar .
CMD ["java", "-jar", "BEProject-0.0.1-SNAPSHOT.jar"]
docker-compose.yml
version: "3.1"
services:
server:
build:
context: .
dockerfile: Dockerfile
container_name: server
restart: on-failure
environment:
MYSQL_ROOT_PASSWORD: "123456aA@$"
MYSQL_DATABASE: "Project"
MYSQL_USER: "user"
MYSQL_PASSWORD: "123456aA@$"
ports:
- "8080:8080"
depends_on:
- db
networks:
- backend
db:
image: mysql:8
container_name: mysql
command: --authentication_policy="*,,"
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "123456aA@$"
MYSQL_DATABASE: "Project"
MYSQL_USER: "user"
MYSQL_PASSWORD: "123456aA@$"
ports:
- "3306:3306"
volumes:
- "./mysql/db:/var/lib/mysql"
- "./init.sql:/docker-entrypoint-initdb.d/init-script.sql"
networks:
- backend
networks:
backend:
1 CÂU TRẢ LỜI
- Để kiểm tra lỗi do đâu thì dùng
docker logs [OPTIONS] CONTAINER
- Làm sao để maven chạy trước sau khi db chạy ? Cái
depends_on
của bạn đã giải quyết vấn đề này. - Dự đoán lỗi: Do không có
network
nên java không kết nối được với mysql. Tìm hiểunetwork
trong docker rồi thêm vào là được
Mình cũng nghĩ vậy. Bác @hungify thử dùng cái depends_on
và kiểm tra lại hostname + credentials của mysql xem server đã dùng đúng chưa?
@mynamebvh @huukimit Thanks 2 anh Do bận quá chưa reply được mình đã fix thành công rồi nha