Docker-compose在Windows 7上:如何在使用yaml文件时导入数据库转储?

时间:2017-01-24 13:45:25

标签: mysql docker dockerfile

我是从这里开始的:https://docs.docker.com/compose/wordpress/

我在Windows 7上运行良好

version: '2'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_PASSWORD: wordpress

  phpmyadmin:
    container_name: phpmyadmin
    depends_on:
      - db
    image: phpmyadmin/phpmyadmin:latest
    environment:
      MYSQL_ROOT_PASSWORD: "mysql_root_password"
      PMA_ARBITRARY: 1
    restart: always
    ports:
     - 8080:80
    volumes:
     - /sessions
volumes:
    db_data:

我的问题是:如何从Windows Machime导入db-dump? 我的目标是在生产转储上本地工作(我已经在我的docker-compose.yaml文件的同一文件夹中有转储)。

2 个答案:

答案 0 :(得分:2)

如果bash进入MySQL容器并且创建了数据库并导入了数据,那么您的第一个问题就是修复。

关于第二个I'm not able to login from within phpMyAdmin并且因为我没有看到您docker-compose.yml上列出的服务,我建议按照phpmyadmin上的文档安装和配置该服务。非常重要的是读取ENV变量here,因为您需要设置它们以允许phpMyAdmin容器从/向MySQL容器读/写。

Ex(来自here):

phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    environment:
     - PMA_ARBITRARY=1
    restart: always
    ports:
     - 8080:80
    volumes:
     - /sessions

你在Dockerfile上遗漏了这个部分,或者你可能还没知道Docker是如何工作的,这导致我建议你阅读一下它。

<强>更新

由于答案与phpMyAdmin不再相关,现在在Windows下转为docker volumes,这里是更新后的答案。

在Windows上装载卷的工作方式与在Linux中一样,例如:

php-fpm:
    build: docker/php-fpm
    volumes:
        - ./sources:/data/www

上面的服务定义适用于两种操作系统,您可以尝试here。我正在使用最新的Docker for Windows(Beta标记为RCXX)

现在,针对您的案例的解决方法可以是安装具有.sql转储文件的主机卷,或者使用Docker中的COPY命令将文件移动到容器内,然后使用{{ 1}}或bash脚本将其导回DB。

答案 1 :(得分:2)

您可以这样做的一种方法是在使用官方mysql映像时将带有转储的文件夹挂载到目录/docker-entrypoint-initdb.d/中。

对于在团队中工作而言,这是一个非常好的解决方案,每个人都应该使用相同的基础数据库。您可以在documentation.中了解更多相关信息。这只会在首次运行容器时发生。如果删除容器,它将进行全新导入。这也是它的用途。

更常见的是,我会像其他一些答案那样建议:

docker-compose exec db mysql -u root -p DB_NAME < DUMP_FILE_IN_CONTAINER

重要的是要注意,仍然需要将转储文件挂载到容器中!它不适用于主机上的文件!

您不一定需要安装整个文件夹(尽管您可以 - 上述文件夹中的所有脚本都将按字母顺序执行)。您可以像下面这样安装转储文件:

services:
  db:
  image: mysql:5.7
  volumes:
    - db_data:/var/lib/mysql
    - ./path/to/dump/on/host.sql:/docker-entrypoint-initdb.d/anyname.sql
  restart: always
  environment:
    MYSQL_ROOT_PASSWORD: wordpress
    MYSQL_DATABASE: wordpress
    MYSQL_USER: wordpress
    MYSQL_PASSWORD: wordpress