Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker编写mysql:import.sql_Mysql_Docker_Docker Compose_Mariadb - Fatal编程技术网

Docker编写mysql:import.sql

Docker编写mysql:import.sql,mysql,docker,docker-compose,mariadb,Mysql,Docker,Docker Compose,Mariadb,我的docker compose脚本成功地运行了mysql/mariadb服务,并将包含数据库架构的“init.sql”脚本复制到“/docker entrypoint initdb.d”。但是,sql脚本从未像它应该的那样执行 没有错误,日志中没有任何内容。我检查了sql文件是否复制到容器中的正确位置。我检查了脚本在空数据库上运行时是否没有错误 我错过了什么?如果脚本被执行(并且出于某种原因什么也没做),它在日志中是否可见 (编辑:docker compose版本:1.8.1,图像:10.1.

我的docker compose脚本成功地运行了mysql/mariadb服务,并将包含数据库架构的“init.sql”脚本复制到“/docker entrypoint initdb.d”。但是,sql脚本从未像它应该的那样执行

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

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

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


查看mariadb映像文件的源代码,该脚本应该执行
init.sql
,很明显

  • 仅当容器之前不包含数据库时(脚本的第76行),才会执行脚本,并且
  • 将有一个日志输出,通知您脚本已被调用
  • 要使用
    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
    脚本的调用及其标准输出被隐藏。在随后启动容器时,不会执行脚本,因为数据库已创建(在本地卷中):


    也许有点晚了,但我找到了另一个更准确的解决方案

    通过
    依赖于
    健康检查
    ,在mysql转储完成之前不要运行后端。唯一的细节是您必须使用2.1版运行它

    # docker-compose.yml
    
    version: '2.1'
    volumes:
      data-volume: {}
    services:
      mysql:
        image: mariadb
        ports:
          - "3306:3306"
        environment:
          MYSQL_ROOT_PASSWORD: pwd
          MYSQL_DATABASE: users_db
        depends_on:
          backend:
            condition: service_healthy
        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
        healthcheck:
          test: "/usr/bin/mysql --user=root --password=you_pass --database=your_db --execute \"SELECT * FROM last_table_of_your_dump;\""
          interval: 10s
          timeout: 3s
          retries: 10
    

    根据(应该执行
    init.sql
    的脚本)的源代码,如果执行,日志中应该有一行(第154行)。能否添加
    docker日志的输出?此外,您的脚本只会在容器第一次启动时执行(第76行)!你必须在两次尝试之间删除它。哦,我确实必须删除容器。谢谢
    docker compose stop
    docker compose rm
    docker compose up
    。你们谁能写一个正式答案?:)但是请注意,没有打印与实际运行的sql脚本相关的日志。也许有一个冗长的选项。但这已经不是问题了。如果@fzgregor没有写一个答案,我明天就写。其他人有问题吗?命令
    docker compose stop docker compose rm
    非常关键,因为它们可以帮助你重新开始。否则,您对撰写文件的更改可能不会生效。@gideomaina您缺少&&符号<代码>docker compose停止(&docker compose rm
    )。我曾经为我工作过
    docker-compose-down和&docker-compose-up。是的,你是对的@Oscar
    
    $ 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
    
    # docker-compose.yml
    
    version: '2.1'
    volumes:
      data-volume: {}
    services:
      mysql:
        image: mariadb
        ports:
          - "3306:3306"
        environment:
          MYSQL_ROOT_PASSWORD: pwd
          MYSQL_DATABASE: users_db
        depends_on:
          backend:
            condition: service_healthy
        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
        healthcheck:
          test: "/usr/bin/mysql --user=root --password=you_pass --database=your_db --execute \"SELECT * FROM last_table_of_your_dump;\""
          interval: 10s
          timeout: 3s
          retries: 10