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

35

我正在尝试在执行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个回答

35

docker-compose中没有类似onrun的东西。它只会启动容器并执行命令。现在你有一些可能的选择。

使用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

使用另一个Docker服务初始化数据库

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一样。


我想为不同版本的应用程序暴露不同的端口,这些版本是彼此独立的,并使用不同的数据库架构。我应该如何暴露这些端口? - raj19
@raj19,那是一个独立的问题,与您最初的问题无关。请发布一个新帖子。 - Tarun Lalwani

8
当容器第一次启动时,将创建一个具有指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行在/docker-entrypoint-initdb.d中找到的扩展名为.sh、.sql和.sql.gz的文件。文件将按字母顺序执行。
来自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文件加载到容器中,然后自动执行。

只有在数据文件夹为空的情况下,它们才会自动执行。 - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接