Asked Feb 15th, 2023 12:36 p.m. 139 2 1
  • 139 2 1
+2

Dockerize spring boot app with mysql

Share
  • 139 2 1

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 ANSWERS


Answered Feb 16th, 2023 1:44 a.m.
Accepted
+1
  1. Để kiểm tra lỗi do đâu thì dùng docker logs [OPTIONS] CONTAINER
  2. 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.
  3. 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ểu network trong docker rồi thêm vào là được
Share
Feb 17th, 2023 2:08 a.m.

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?

0
| Reply
Share
Feb 17th, 2023 3:49 a.m.

@mynamebvh @huukimit Thanks 2 anh Do bận quá chưa reply được mình đã fix thành công rồi nha

+2
| Reply
Share
Viblo
Let's register a Viblo Account to get more interesting posts.