Docker compose 不执行 .sql

Posted

技术标签:

【中文标题】Docker compose 不执行 .sql【英文标题】:Docker compose does not execute .sql 【发布时间】:2019-09-15 13:33:20 【问题描述】:

尝试为我的应用程序使用 docker compose,因此使用官方 mysql 映像和我自己的 Dockerfile 来创建我的应用程序映像。我想我的initdb.sql 在 docker compose up 期间没有执行。

运行如下:

docker-compose up --build

但是我看不到initdb.sql被执行了。

我的 docker compose 看起来像这样:

version: "3"
services:
  db:
    image: mysql:5.7
    restart: always
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_DATABASE: "MYDB"
      MYSQL_USER: "myuser"
      MYSQL_PASSWORD: "mypassword"
      MYSQL_ROOT_PASSWORD: "mypassword"
    ports:
      - "3306:3306"
    expose:
      - "3306"
    volumes:
      - my-db:/var/lib/mysql
      - ./sqlinit:/docker-entrypoint-initdb.d/initdb.sql
    networks:
      vpcbr:
        ipv4_address: 10.5.0.6
  app:
    restart: always
    build: .
    ports:
      - 5000:5000
    volumes:
      - .:/app
    depends_on:
      - db
    networks:
      vpcbr:
        ipv4_address: 10.5.0.5

volumes:
  my-db:

networks:
  vpcbr:
    driver: bridge
    ipam:
      config:
        - subnet: 10.5.0.0/16
        #  gateway: 10.5.0.1

如你所见,我在这个目录./sqlinit 中有我的initdb.sql,在我登录到 mysql 容器后,我可以在/docker-entrypoint-initdb.d/initdb.sql 中看到这个文件

但看起来没有执行,因为当我登录我的应用程序时,我可以看到:

pymysql.err.OperationalError: (1044, "Access denied for user 'myuser'@'%' to database 'MYDB'")

在容器mysql上

2019-09-15T13:17:59.361447Z 2 [注意] 用户 'myuser'@'%' 拒绝访问数据库 'MYDB

我当然做错了,我在这里发现了一些类似的问题,但我仍然没有解决我的问题

【问题讨论】:

【参考方案1】:

问题应该出在您映射卷的方式上。您应该将源文件映射到目标文件,而不是将源文件夹映射到文件中,如下所示:

- ./sqlinit/initdb.sql:/docker-entrypoint-initdb.d/initdb.sql

【讨论】:

嗨@picadoh,感谢您的评论。我认为这不是问题,因为脚本位于容器 /docker-entrypoint-initdb.d/initdb.sql 上,而且我认为不需要在 ./sqlinit 中指定任何文件。我可以有更多的 *.sql 并且应该执行所有的。无论如何,我确实尝试了您的解决方案和同样的问题:( 你为 mysql 容器运行了docker-compose logs 吗?只是为了确保它在启动时没有记录任何错误。 同样值得以 root 用户登录到 mysql,以确保创建内容。这可能只是不向该用户授予正确权限的问题。或者手动运行该脚本以了解脚本本身是否存在问题。 嗨@picadoh,我想我知道出了什么问题:(因为我多次使用创建卷-我猜。现在删除卷my-db并运行docker-compose up --build而且我看不到相同的错误,我可以看到其他类似的表没有创建,但这是另一个问题。创建了数据库并执行了其他内容,因此执行了脚本。所以在我的情况下,每次更改某些内容时我都应该删除卷docker-compose.yml - 谢谢 对不起,我设置得太早了,但看起来我可以看到这个错误 db_1 | /usr/local/bin/docker-entrypoint.sh:运行 /docker-entrypoint-initdb.d/initdb.sql db_1 | mysql: [警告] 在命令行界面上使用密码可能不安全。 db_1 |错误:无法初始化 batch_readline - 可能是输入源是目录或块设备。

以上是关于Docker compose 不执行 .sql的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose mysql init sql 未执行

Docker-compose mysql:导入 .sql

docker-compose安装后执行报错

docker-compose部署nacos单机版(简洁优化版)

Docker-compose 与 H2 docker 数据库的 setup.sql 文件

docker-compose.yml文件