Выполнить сценарий SQL при создании докера - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть проект, который запускается, когда ./entrypoint.sh или docker-compose up запускается из корневого каталога проекта и генерирует интерфейс API swagger, но вызовы возвращают ответную запись без данных.

Если я запускаю с MySQL на localhost без докера, работает отлично.Как мне загрузить данные?

entrypoint.sh

#!/bin/bash

docker network create turingmysql
docker container run -p  3306:3306 --name mysqldb --network turingmysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=tshirtshop -d mysql:5.7
docker-compose build
docker-compose up

DockerFile

FROM mysql:5.7

ADD ./database/tshirtshop.sql /docker-entrypoint-initdb.d
#### Stage 1: Build the application
FROM openjdk:8-jdk-alpine as build

# Set the current working directory inside the image
WORKDIR /app

# Copy maven executable to the image
COPY mvnw .
COPY .mvn .mvn

# Copy the pom.xml file
COPY pom.xml .

# Build all the dependencies in preparation to go offline. 
# This is a separate step so the dependencies will be cached unless 
# the pom.xml file has changed.
RUN ./mvnw dependency:go-offline -B

# Copy the project source
COPY src src


# Package the application
RUN ./mvnw package -DskipTests
RUN mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar)

#### Stage 2: A minimal docker image with command to run the app 
FROM openjdk:8-jre-alpine

ARG DEPENDENCY=/app/target/dependency

# Copy project dependencies from the build stage
COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app

ENTRYPOINT ["java","-cp","app:app/lib/*","com.turing.ecommerce.TuringApplication"]

docker-compose.yml

version: '3.7'

# Define services
services:
  # App backend service
  app-server:
    # Configuration for building the docker image for the backend service
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080" # Forward the exposed port 8080 on the container to port 8080 on the host machine
    restart: always
    depends_on: 
      - mysqldb # This service depends on mysql. Start that first.
    environment: # Pass environment variables to the service
      SPRING_DATASOURCE_URL: jdbc:mysql://mysqldb:3306/tshirtshop?useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: root   
    networks: # Networks to join (Services on the same network can communicate with each other using their name)
      - turingmysql

      # Database Service (Mysql)
  mysqldb:
    image: mysql:5.7
    ports:
      - "3306:3306"
    restart: always

    environment:
      MYSQL_DATABASE: tshirtshop
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - db-data:/var/lib/mysql

    networks:
      - turingmysql  


# Volumes
volumes:
  db-data:

# Networks to be created to facilitate communication between containers
networks:
  turingmysql:

Ответы [ 3 ]

0 голосов
/ 27 сентября 2019

Если вы копируете sql scipt уже в сборку Docker, вам не нужно снова отображать его в docker-compose, если у вас есть docker-compose, то вы не выполняете одну команду bash script docker-compose up --build выполнитjob.

Поэтому измените ваш docker-compose согласно вашему Dockerfile.

Dockerfile

FROM mysql

ADD init.sql /docker-entrypoint-initdb.d

docker-compose

version: '3.7'

services:
  # App backend service
  app-server:
    # Configuration for building the docker image for the backend service
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080" # Forward the exposed port 8080 on the container to port 8080 on the host machine
    restart: always
    depends_on: 
      - mysqldb # This service depends on mysql. Start that first.
    environment: # Pass environment variables to the service
      SPRING_DATASOURCE_URL: jdbc:mysql://mysqldb:3306/tshirtshop?useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: root   
    networks: # Networks to join (Services on the same network can communicate with each other using container name)
      - uringmysql

      # Database Service (Mysql)

  mysql:
    build: .
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: appdata
      MYSQL_USER: test
      MYSQL_PASSWORD: root123
    volumes:
      - db-data:/var/lib/mysql
    tty: true
# Volumes
volumes:
  db-data:

# Networks to be created to facilitate communication between containers
networks:
  turingmysql:

Теперь просто запустите

docker-compose up --build

это создаст и увеличит контейнер, и вам не нужно будет отображать скрипт инициализации хоста, как это уже в образе Docker.

Структура каталогов будет выглядеть как

enter image description here

Теперь ваше приложение сможет получить доступ к БД, используя jdbc:mysql://mysqldb:3306/tshirtshop? эту конечную точку, поскольку оба находятся в одной сети и могут ссылаться друг на друга, используя имя.

0 голосов
/ 27 сентября 2019

Спасибо cricket_007 и Adii за ответы.Они направили меня в правильном направлении.Я хочу задокументировать свой опыт и то, как проблема была решена.Новичок в докеризации, поэтому я учился на практике.Для любого новичка в dockerization и с такими же проблемами в Spring Boot, MySQL и docker, это наверняка поможет

Во-первых, мой entrypoint.sh изменился ниже.Docker-compose down предназначен для перезапусков.

     #!/bin/bash

docker-compose down -v
docker-compose up --build

Во-вторых, мне пришлось использовать существующее изображение mysql вместо его создания.

version: '3.7'

# Define services
services:
  # App backend service
  app-server:
    # Configuration for building the docker image for the backend service
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080" # Forward the exposed port 8080 on the container to port 8080 on the host machine
    restart: always
    depends_on: 
      - mysql # This service depends on mysql. Start that first.
    environment: # Pass environment variables to the service
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/tshirtshop?useSSL=false&allowPublicKeyRetrieval=true&useLegacyDatetimeCode=false&serverTimezone=UTC
      SPRING_DATASOURCE_USERNAME: turing
      SPRING_DATASOURCE_PASSWORD: pass  
    networks: # Networks to join (Services on the same network can communicate with each other using their name)
      - turingmysql

      # Database Service (Mysql)
  mysql:
    image: mysql/mysql-server
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: tshirtshop
      MYSQL_USER: turing
      MYSQL_PASSWORD: pass


    volumes:
      - db-data:/var/lib/mysql
      - ./database:/docker-entrypoint-initdb.d
    tty: true
    networks: # Networks to join (Services on the same network can communicate with each other using their name)
      - turingmysql

# Volumes
volumes:
  db-data:

 # Networks to be created to facilitate communication between containers
networks:
  turingmysql:
    driver: bridge

Необходимо указать, что сеть является мостом.Мой файл sql был смонтирован из папки относительно docker-compose.yml.Также пришлось добавить allowPublicKeyRetrieval = true в мой URL-адрес jdbc.Создан пользователь для доступа к базе данных tshirtshop.

А вот и Dockerfile.

#### Stage 1: Build the application
FROM openjdk:8-jdk-alpine as build

# Set the current working directory inside the image
WORKDIR /app

# Copy maven executable to the image
COPY mvnw .
COPY .mvn .mvn

# Copy the pom.xml file
COPY pom.xml .

# Build all the dependencies in preparation to go offline. 
# This is a separate step so the dependencies will be cached unless 
# the pom.xml file has changed.
RUN ./mvnw dependency:go-offline -B

# Copy the project source
COPY src src


# Package the application
RUN ./mvnw package -DskipTests
RUN mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar)

#### Stage 2: A minimal docker image with command to run the app 
FROM openjdk:8-jre-alpine

ARG DEPENDENCY=/app/target/dependency

# Copy project dependencies from the build stage
COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app

ENTRYPOINT ["java","-cp","app:app/lib/*","com.turing.ecommerce.TuringApplication"]

для запуска из корневого каталога проекта ./entrypoint.sh на Mac, а остальное - история.

0 голосов
/ 27 сентября 2019

У вас есть два Dockerfiles?Похоже, вы создали свой собственный контейнер MySQL?

В противном случае они не должны быть частью вашей Java многоэтапной сборки

FROM mysql:5.7

ADD ./database/tshirtshop.sql /docker-entrypoint-initdb.d

Предполагая, что вы создали отдельный образ для mysql,в Docker-Compose вы его не используете, так как вы по-прежнему ссылаетесь на image: mysql:5.7

Вместо того, чтобы создавать свой собственный, вы должны смонтировать в него SQL-скрипт

Дляпример

  mysqldb:
    image: mysql:5.7
    ...
    volumes:
      - db-data:/var/lib/mysql
      - ./database/tshirtshop.sql:/docker-entrypoint-initdb.d/0_init.sql

Затем на минутку забудьте сервис Java и используйте MySQL workbench или mysql CLI, чтобы убедиться, что данные действительно есть.После этого запустите API

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...