如何在docker-compose.yml上运行docker exec

时间:2017-08-19 17:07:56

标签: docker docker-compose

我正在尝试在docker-compose.yml文件执行期间创建一个mysql数据库模式

  version: "2"
  services:
  web:
    build: docker
    ports:
      - "8080:8080"

  environment:
    - MYSQL_ROOT_PASSWORD=root

   mysql:
   image: mysql:latest
    environment:
     - MYSQL_ROOT_PASSWORD=root
     - MYSQL_DATABASE=test

     ports:
      - "3306:3306"
   links:
    - web

 onrun:
 command: "docker exec -i test_mysql_1 mysql -uroot -proot test <dummy1.sql"

我试过onrun,但这不起作用。 我正在构建第一张图片,但从docker hub中拉出第二张图片。 请在docker-compose up

之后帮助您完成以下命令

2 个答案:

答案 0 :(得分:17)

onrun中没有docker-compose。它只会调出容器并执行命令。现在你有几个可能的选择

使用mysql图像初始化

mysql:
 image: mysql:latest
 environment:
   - MYSQL_ROOT_PASSWORD=root
   - MYSQL_DATABASE=test
  volumes: 
    - ./dummy1.sql:/docker-entrypoint-initdb.d/dummy1.sql
 ports:
  - "3306:3306"

您可以将容器内的/docker-entrypoint-initdb.d内的sql文件

使用bash脚本

docker-compose up -d
# Give some time for mysql to get up
sleep 20
docker-compose exec mysql mysql -uroot -proot test <dummy1.sql

使用其他泊坞窗服务初始化数据库

version: "2"
services:
  web:
    build: docker
    ports:
      - "8080:8080"

  environment:
    - MYSQL_ROOT_PASSWORD=root

   mysql:
   image: mysql:latest
    environment:
     - MYSQL_ROOT_PASSWORD=root
     - MYSQL_DATABASE=test

     ports:
      - "3306:3306"
   mysqlinit:
     image: mysql:latest
     volumes:
       - ./dummy1.sql:/dump/dummy1.sql
     command: bash -c "sleep 20 && mysql -h mysql -uroot -proot test < /dump/dummy1.sql"

您运行的另一项服务将为您启动数据库,例如上面的mysqlinit

答案 1 :(得分:3)

  

首次启动容器时,将创建具有指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行扩展名为.sh,.sql和.sql.gz的文件,这些文件位于/docker-entrypoint-initdb.d中。文件将按字母顺序执行。

来自https://hub.docker.com/_/mysql/

这是在容器创建时初始化自己的数据库(postgresql,mysql,...)的便捷方式。您应该创建一个* .sql / * .sh文件并通过 volume 将其绑定到新容器中:

db:
  image: mysql:latest
  volumes: 
    - ./db/entrypoint:/docker-entrypoint-initdb.d
  environment:
    - MYSQL_ROOT_PASSWORD=iamgroot
    - MYSQL_DATABASE=gotg

这会将所有sql / sh文件加载到容器中,然后自动执行。