【问题标题】:How to load csv into mysql with docker-compose?如何使用 docker-compose 将 csv 加载到 mysql 中?
【发布时间】:2021-09-10 21:45:03
【问题描述】:

我想将 csv 加载到我的 mysql 容器中。

这是我的 docker-compose:

version: '3.7'

services: 
  db:
    image: mysql
    ports:
      - 3306:3306
    environment: 
      - MYSQL_ROOT_PASSWORD=root123
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test123
    volumes:
      - './init.sql:/docker-entrypoint-initdb.d/init.sql'
      - './init_data:/docker-entrypoint-initdb.d/init_data'

它确实会创建表格,但不会将 csv 加载到表格中。

据我研究,我必须将此作为参数传递给 mysql 映像,但我不知道如何通过 docker-compose 添加参数。

--secure-file-priv=docker-entrypoint-initdb.d

This 是我关注的。

但我不想使用 docker run。

欢迎任何帮助或提示。

【问题讨论】:

    标签: mysql docker docker-compose


    【解决方案1】:

    您不能在 docker compose 中添加参数进行构建,因为 docker compose 无法构建图像。更清楚的是,它可以通过调用 docker build(使用您在 docker-compose.yml 中提供的信息),但是您在 构建图像 中调用的内容只能在 @987654322 中定义@。您不能在 docker-compose.yml 中给出命令进行构建。

    您可以做什么:您可以使用mysql 镜像作为基础来创建您自己的镜像 - 使用它自己的 Dockerfile。大致如此:

    services:
      mymysql:
        build:
          context: ./mymysql
        ...other things in your docker compose...
    

    这将定义一个名为mymysql 的新容器,其定义位于./mymysql 目录中。创建此目录,然后将Dockerfile 放入其中。这个 Dockerfile 应该是这样的

    FROM mysql:latest
    USER mysql
    RUN ...
    RUN ...
    

    RUN 行中,您可以定义命令,将执行什么 - 在拉取的mysql:latest 图像上并为您生成mymysql


    替代选项:启动容器并通过运行它来加载 csv。然后停止容器。之后,docker commit fce2ea31 mymysql 会将停止的容器保存为新图像,以您想要的名称命名。这更容易,但重现性要差得多,所以我建议先做。

    【讨论】:

    • 我试过了,但我真的不知道要在 docker 文件中运行什么。如果我尝试运行加载数据的 sql,它会给我一个类似这样的错误 ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv 选项,因此它无法执行此语句并且错误是同样使用 docker exec FROM mysql COPY ./init_data/ /docker-entrypoint-initdb.d/init_data/ COPY ./sql-scripts/ /docker-entrypoint-initdb.d/
    • @JPcode 那是另一个问题。容器中的 Mysql 配置为仅允许从固定目录加载此类文件。这就是--secure-file-priv 所做的。最好是关闭它。为此,您需要检查容器并对其进行修改以在没有此参数的情况下执行 mysql。
    • @JPcode 我不太了解那个特定的容器,但我知道 mysql 和一般的 docker。 --secure-file-priv 来自 my.cnf,或来自 mysql 的命令行参数。找到该配置并覆盖设置:通过使用 COPY 覆盖配置文件,或者更好地扩展配置。或者,您也可以通过 mysqld 的命令行参数覆盖它(它由 CMD 或容器中的某些脚本调用)。 mysql:latest 容器的源代码(包括 Dockerfile)可能会有很大帮助,而且很可能是可用的。
    • 感谢您的意见。我在 docker 文件 RUN sed -i 's/secure-file-priv= NULL/secure-file-priv= docker-entrypoint-initdb.d/g' /etc/mysql/my.cnf 中使用了一个命令,现在它可以工作了!谢谢你。 (对不起,我花了很长时间)@peterh
    猜你喜欢
    • 2022-07-07
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2020-10-30
    • 2022-11-08
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多