Dockerfile使用python和mysql创建映像

Dockerfile使用python和mysql创建映像,python,mysql,docker,Python,Mysql,Docker,我有两个容器“web”和“db”。我有一个csv格式的现有数据文件 问题是我可以使用docker compose使用模式初始化MySQL数据库,或者只使用参数运行,但是如何导入现有数据?我有Python脚本来解析和过滤数据,然后将其插入到db中,但我无法在“db”容器中运行它,因为单个映像是MySQL 更新1 version: '3' services: web: container_name: web build: . restart: always lin

我有两个容器“web”和“db”。我有一个csv格式的现有数据文件

问题是我可以使用docker compose使用模式初始化MySQL数据库,或者只使用参数运行,但是如何导入现有数据?我有Python脚本来解析和过滤数据,然后将其插入到db中,但我无法在“db”容器中运行它,因为单个映像是MySQL

更新1

version: '3'
services:
  web:
    container_name: web
    build: .
    restart: always
    links:
      - db
    ports:
      - "5000:5000"
  db:
    image: mysql
    container_name: db
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_DATABASE: "test"
      MYSQL_USER: "test"
      MYSQL_PASSWORD: "test"
      MYSQL_ROOT_PASSWORD: "root"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    ports:
      - "33061:3306"
有一个Python脚本,用于从csv文件中读取数据并将其插入数据库,效果很好。现在我想在MySQL容器设置完成后运行脚本。(我已经在容器中完成了Python和MySQL的连接)


否则,任何人都有更好的导入现有数据的解决方案?

从Dockerfile,您可以调用脚本(Entrypoint)。在这个脚本中,您可以调用python脚本。例如:

DockerFile:

FROM php:7.2-apache

RUN apt-get update    
COPY ./entrypoint.sh /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

这将在应用程序容器中运行您的入口点脚本。确保您已根据应用程序容器撰写说明中的属性执行操作。

您可以从Dockerfile调用脚本(入口点)。在这个脚本中,您可以调用python脚本。例如:

DockerFile:

FROM php:7.2-apache

RUN apt-get update    
COPY ./entrypoint.sh /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

这将在应用程序容器中运行您的入口点脚本。请确保您的应用程序容器撰写说明中的
依赖于
属性。

MySQL docker image能够执行shell脚本或sql文件,如果这些脚本或sql文件安装在
/docker entrypoint initdb.d
下,用于运行中的容器,如和中所述。因此,我建议您编写一个SQL文件来读取CSV文件(您应该将其装载到容器中,以便SQL文件能够读取它),以便将其恢复到MySQL,可能类似于或编写一个bash脚本来将CSV导入MySQL,无论对您来说是什么


您可以在官方dockerhub页面检查初始化一个新实例,查看MySQL docker映像是否能够执行shell脚本或sql文件,如果这些脚本或sql文件安装在运行容器的
/docker entrypoint initdb.d
下,如和中所述。因此,我建议您编写一个SQL文件来读取CSV文件(您应该将其装载到容器中,以便SQL文件能够读取它),以便将其恢复到MySQL,可能类似于或编写一个bash脚本来将CSV导入MySQL,无论对您来说是什么



您可以在dockerhub官方页面中选中初始化新实例,

您可以启动第三个临时容器来运行导入一次。共享您的
docker compose.yml
,我们可以从那里获得它!您是否有可以共享的现有Docker Compose设置?这听起来像是一个非常典型的设置,将Python脚本连接到另一个容器中的数据库。@Max我已经成功地使用了与您建议的相同的方法。但这会有点多余吗?因为一旦导入数据,就不需要现有的第三个容器了。@DavidMaze我用Python脚本将它们连接起来,但我想用现有的数据对它们进行设置。您可以启动第三个临时容器来运行导入一次。共享您的
docker compose.yml
,我们可以从那里获得它!您是否有可以共享的现有Docker Compose设置?这听起来像是一个非常典型的设置,将Python脚本连接到另一个容器中的数据库。@Max我已经成功地使用了与您建议的相同的方法。但这会有点多余吗?因为一旦导入数据,就不需要现有的第三个容器。@DavidMaze我用Python脚本连接它们,但我想用现有数据设置它们。我想将数据和应用程序分离。数据应该在“db”容器中,但我正在寻找一种方法将数据导入MySQL。我想将数据和应用程序分离。数据应该在“db”容器中,但我正在寻找将数据导入MySQL的方法。在您的解决方案中,在导入数据库之前,不可能修改容器中的数据。我对Docker真是个新手。这是将数据和应用程序分离的最佳方式吗?您能详细说明一下吗?你说你已经把数据作为CSV了,对吧。我有一个csv文件,它位于某人的github中。在导入到数据库之前,我想用git克隆数据并修改数据的某些格式,如将%转换为十进制。因此,在这种情况下,您可以添加一个bash脚本来克隆数据并进行修改,然后将其导入MySQL。您的意思是用bash修改数据吗?在您的解决方案中,在导入到数据库之前,无法修改容器中的数据。我对Docker真是个新手。这是将数据和应用程序分离的最佳方式吗?您能详细说明一下吗?你说你已经把数据作为CSV了,对吧。我有一个csv文件,它位于某人的github中。在导入到数据库之前,我想用git克隆数据并修改数据的某些格式,例如将%转换为十进制。因此,在这种情况下,您可以添加一个bash脚本来克隆数据并进行修改,然后将其导入MySQL。您的意思是用bash修改数据吗?