Docker-compose mysql:导入.sql

在使用docker-compose运行mysql/mariadb服务时,将init.sql脚本复制到/docker-entrypoint-initdb.d目录下,但发现脚本并未按预期执行。检查确认sql文件位置正确且无语法错误。解决方案是停止服务,删除容器,重新启动以确保在无数据库时执行脚本。日志中会有脚本调用的记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回答问题

我的 docker-compose 脚本成功地运行了 mysql/mariadb 服务,并将包含数据库模式的“init.sql”脚本复制到“/docker-entrypoint-initdb.d”。但是,根据文档](https://hub.docker.com/_/mariadb/),sql 脚本永远不会像[那样执行。

没有错误,日志中没有任何内容。我检查了 sql 文件是否复制到容器中的正确位置。我检查了脚本在空数据库上运行时没有错误。

我错过了什么?如果脚本被执行(并且由于某种原因什么也没做),它甚至在日志中可见吗?

(编辑: docker-compose 版本:1.8.1,图像 mariadb:10.1.21)

# docker-compose.yml

version: '2'
volumes:
  data-volume: {}
services:
  mysql:
    image: mariadb
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: pwd
      MYSQL_DATABASE: users_db
    volumes:
      - data-volume:/var/lib/mysql
      - ./resources/docker-sql/init.sql:/docker-entrypoint-initdb.d/init.sql
  backend:
    image: myapp
    ports:
      - "8000:80"
    depends_on:
      - mysql
    links:
      - mysql

Answers

查看 mariadb 映像的docker-entrypoint.sh文件的来源,该脚本应该执行您的init.sql,很明显

  1. 脚本只会在容器之前不包含数据库时执行(脚本第 76 行),并且

  2. 会有一个日志输出通知你你的脚本被调用了。

要使用docker-compose实现此目的,您必须停止服务,删除容器(以摆脱数据库)并重新启动它:

docker-compose stop
docker-compose rm
docker-compose start

这是图像行为的示例,仅使用.sh文件而不是.sql:

$ cat hello.sh 
echo "This is output of the hello script"
$ docker run -it -v `pwd`/hello.sh:/docker-entrypoint-initdb.d/hello.sh -v mariadb_test:/var/lib/mysql -e MYSQL_RANDOM_ROOT_PASSWORD=1 mariadb   
Initializing database
2017-02-09 14:13:54 140617005938624 [Note] /usr/sbin/mysqld (mysqld 10.1.21-MariaDB-1~jessie) starting as process 63 ...
2017-02-09 14:13:54 140617005938624 [Note] InnoDB: Using mutexes to ref count buffer pool pages
2017-02-09 14:13:54 140617005938624 [Note] InnoDB: The InnoDB memory heap is disabled
2017-02-09 14:13:54 140617005938624 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
[...]
2017-02-09 14:14:03 139836212086528 [Note] InnoDB: Dumping buffer pool(s) not yet started
2017-02-09 14:14:03 139836971521984 [Note] Plugin 'FEEDBACK' is disabled.
2017-02-09 14:14:03 139836971521984 [Warning] 'user' entry 'root@830dbd0908f3' ignored in --skip-name-resolve mode.
2017-02-09 14:14:03 139836971521984 [Warning] 'proxies_priv' entry '@% root@830dbd0908f3' ignored in --skip-name-resolve mode.
2017-02-09 14:14:03 139836971521984 [Note] mysqld: ready for connections.
Version: '10.1.21-MariaDB-1~jessie'  socket: '/var/run/mysqld/mysqld.sock'  port: 0  mariadb.org binary distribution
Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
GENERATED ROOT PASSWORD: dau6voh4eej2jooRohpiop4eh6ahl7Uz
2017-02-09 14:14:05 139836970654464 [Warning] 'proxies_priv' entry '@% root@830dbd0908f3' ignored in --skip-name-resolve mode.

/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/hello.sh
This is output of the hello script

2017-02-09 14:14:05 139836970351360 [Note] mysqld: Normal shutdown

2017-02-09 14:14:05 139836970351360 [Note] Event Scheduler: Purging the queue. 0 events
2017-02-09 14:14:05 139836195301120 [Note] InnoDB: FTS optimize thread exiting.
2017-02-09 14:14:05 139836970351360 [Note] InnoDB: Starting shutdown...
2017-02-09 14:14:05 139836970351360 [Note] InnoDB: Waiting for page_cleaner to finish flushing of buffer pool
2017-02-09 14:14:07 139836970351360 [Note] InnoDB: Shutdown completed; log sequence number 1616829
2017-02-09 14:14:07 139836970351360 [Note] mysqld: Shutdown complete


MySQL init process done. Ready for start up.
[...]

您会在日志输出的某处看到hello.sh脚本的调用及其标准输出被掩埋。在容器的后续启动中,不会执行脚本,因为数据库已经创建(在本地 mariadb 卷中):

$ docker run -it -v `pwd`/hello.sh:/docker-entrypoint-initdb.d/hello.sh -v mariadb_test:/var/lib/mysql -e MYSQL_RANDOM_ROOT_PASSWORD=1 mariadb
2017-02-09 14:19:13 140155189532608 [Note] mysqld (mysqld 10.1.21-MariaDB-1~jessie) starting as process 1 ...
2017-02-09 14:19:13 140155189532608 [Note] InnoDB: Using mutexes to ref count buffer pool pages
2017-02-09 14:19:13 140155189532608 [Note] InnoDB: The InnoDB memory heap is disabled
2017-02-09 14:19:13 140155189532608 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2017-02-09 14:19:13 140155189532608 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
2017-02-09 14:19:13 140155189532608 [Note] InnoDB: Compressed tables use zlib 1.2.8
2017-02-09 14:19:13 140155189532608 [Note] InnoDB: Using Linux native AIO
2017-02-09 14:19:13 140155189532608 [Note] InnoDB: Using SSE crc32 instructions
2017-02-09 14:19:13 140155189532608 [Note] InnoDB: Initializing buffer pool, size = 256.0M
2017-02-09 14:19:13 140155189532608 [Note] InnoDB: Completed initialization of buffer pool
2017-02-09 14:19:13 140155189532608 [Note] InnoDB: Highest supported file format is Barracuda.
2017-02-09 14:19:13 140155189532608 [Note] InnoDB: 128 rollback segment(s) are active.
2017-02-09 14:19:13 140155189532608 [Note] InnoDB: Waiting for purge to start
2017-02-09 14:19:13 140155189532608 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.34-79.1 started; log sequence number 1616839
2017-02-09 14:19:13 140154429736704 [Note] InnoDB: Dumping buffer pool(s) not yet started
2017-02-09 14:19:13 140155189532608 [Note] Plugin 'FEEDBACK' is disabled.
2017-02-09 14:19:13 140155189532608 [Note] Server socket created on IP: '::'.
2017-02-09 14:19:13 140155189532608 [Warning] 'proxies_priv' entry '@% root@830dbd0908f3' ignored in --skip-name-resolve mode.
2017-02-09 14:19:13 140155189532608 [Note] mysqld: ready for connections.
Version: '10.1.21-MariaDB-1~jessie'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution
已知这是后端项目中的application.yml中的部分内容: server: port: 9090 spring: data: redis: port: 6379 host: cache-server1 password: 123456 datasource: url: jdbc:mysql://db-server1:3306/docker?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8&useUnicode=true username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath*:mapper/*.xml type-aliases-package: com.lu.hotel.entity configuration: map-underscore-to-camel-case: true 把后端项目打包成hotel-0.0.1-SNAPSHOT.jar后,在docker中使用docker compose对springboot项目进行部署,新建了一个mydata目录,下面是dockerfile,docker-compose.yml,mysql,redis和hotel-0.0.1-SNAPSHOT.jar,其中把数据库的hotel.sql文件放在了mysql/init下面,hotel.sql是整个数据库SQL文件,里面有很多表,已知dockerfile的内容如下: FROM openjdk:23-jdk-bookworm MAINTAINER docker COPY hotel-0.0.1-SNAPSHOT.jar /hotel.jar ENTRYPOINT ["java", "-jar", "/hotel.jar"] EXPOSE 9090 已知docker-compose.yml的文件内容如下: services: back-server: build: . container_name: hotel ports: - "9090:9090" networks: - demo_net depends_on: - cache-server - db-server cache-server: image: redis:6.0.8 container_name: "cache-server1" ports: - "6379:6379" volumes: - ./redis/data:/data networks: demo_net: ipv4_address: 172.16.0.4 db-server: image: mysql:5.7 container_name: "db-server1" environment: MYSQL_ROOT_PASSWORD: 'root' MYSQL_ALLOW_EMPTY_PASSWORD: 'no' MYSQL_DATABASE: 'docker' MYSQL_USER: 'docker' MYSQL_PASSWORD: 'docker' ports: - "3307:3306" volumes: - ./mysql/db:/var/lib/mysql - ./mysql/init:/docker-entrypoint-initdb.d networks: demo_net: ipv4_address: 172.16.0.3 command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci networks: demo_net: ipam: config: - subnet: 172.16.0.0/24 以上部分
最新发布
03-20
<think>嗯,用户想了解如何正确配置并运行包含Spring Boot应用、Redis和MySQLDocker Compose环境。我需要结合之前的引用内容来给出解答。首先,用户提到了Docker Compose的配置和启动问题,可能涉及到服务之间的网络连接以及依赖顺序。 根据引用[2],使用Docker内部网络是关键,容器间可以通过服务名称作为主机名访问。所以应该在docker-compose.yml中定义自定义网络,确保所有服务都在同一个网络下。另外,引用[3]和[4]提到需要编写Dockerfile和docker-compose.yml文件,并且需要注意镜像的构建和依赖配置。 接下来,用户可能需要分步骤的指导,比如如何组织项目结构,编写Dockerfile,配置docker-compose.yml,处理环境变量,以及如何确保服务启动顺序正确。同时,常见的问题比如连接失败,可能需要检查网络配置、环境变量是否正确,以及服务是否健康。 还要注意Spring Boot应用的配置文件中,数据库和Redis的主机名应该使用docker-compose中定义的服务名称,比如mysql和redis,端口保持默认。此外,MySQL和Redis的容器可能需要一些初始化配置,比如root密码、数据库创建等,这些可以通过environment部分设置。 最后,用户可能想知道如何构建镜像、启动服务以及排查启动问题。需要提醒他们使用docker-compose up命令,并查看日志来调试问题。可能还需要提到健康检查或者depends_on来确保服务依赖正确。</think>### 分步配置与启动Docker Compose环境 #### 1. 项目结构准备 ``` project/ ├── src/ # Spring Boot项目源码 ├── Dockerfile # Spring Boot应用镜像构建文件 └── docker-compose.yml # 定义多服务容器配置 ``` #### 2. Dockerfile配置 ```dockerfile FROM openjdk:17-jdk-slim ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"] ``` #### 3. docker-compose.yml核心配置 ```yaml version: '3.8' services: mysql: image: mysql:8.0 container_name: mysql-8 environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: appdb ports: - "3306:3306" networks: - app-network volumes: - mysql_data:/var/lib/mysql redis: image: redis:6.2-alpine container_name: redis-6 ports: - "6379:6379" networks: - app-network volumes: - redis_data:/data springboot-app: build: . container_name: spring-app depends_on: mysql: condition: service_healthy redis: condition: service_started environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/appdb SPRING_REDIS_HOST: redis ports: - "8080:8080" networks: - app-network networks: app-network: driver: bridge volumes: mysql_data: redis_data: ``` #### 4. 关键配置说明 - **网络配置**:所有服务共享`app-network`网络,确保容器间通过服务名直连[^2] - **依赖控制**:使用`depends_on`+健康检查确保服务启动顺序 - **数据持久化**:通过命名卷保持数据库和Redis数据 - **环境变量**:Spring Boot通过服务名访问数据库和Redis(mysql/redis) #### 5. 启动流程 ```bash # 构建镜像并启动 docker-compose up -d --build # 查看实时日志 docker-compose logs -f springboot-app # 停止服务 docker-compose down ``` #### 6. 常见问题排查 1. **连接超时问题**: - 检查网络配置是否一致 - 验证容器IP是否在同一个子网(`docker network inspect`) - 确认服务名称拼写正确[^2] 2. **数据库初始化失败**: ```yaml # 添加初始化脚本(mysql服务配置) volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql ``` 3. **健康检查配置**: ```yaml # 增强mysql健康检查 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 5s timeout: 10s retries: 5 ``` 4. **时区同步**: ```yaml # 统一容器时区 environment: TZ: Asia/Shanghai ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全能资料库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值