在 docker compose 上执行 SQL 脚本

tks*_*con 5 mysql docker

我有一个项目,它在 ./entrypoint.sh 或 docker-compose up 从项目的根目录运行时运行并生成 swagger API 接口,但调用返回条目响应没有数据。

如果我在没有 docker 的情况下在 localhost 上使用 MySQL 运行,则效果很好。我如何加载数据?

入口点.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
Run Code Online (Sandbox Code Playgroud)

文件

FROM mysql:5.7

ADD ./database/tshirtshop.sql /docker-entrypoint-initdb.d
Run Code Online (Sandbox Code Playgroud)
#### 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"]
Run Code Online (Sandbox Code Playgroud)

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:
Run Code Online (Sandbox Code Playgroud)

cri*_*007 3

你有两个 Dockerfile 吗?看起来你构建了自己的 MySQL 容器?

否则,这些不应该成为Java多阶段构建的一部分

FROM mysql:5.7

ADD ./database/tshirtshop.sql /docker-entrypoint-initdb.d
Run Code Online (Sandbox Code Playgroud)

假设您确实在 Docker-Compose 中为 mysql 构建了一个单独的映像,那么您没有使用它,因为您仍然提到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
Run Code Online (Sandbox Code Playgroud)

然后,暂时忘记 Java 服务,并使用 MySQL Workbench 或 mysql CLI 来验证数据是否确实存在。完成后,启动 API