代码之家  ›  专栏  ›  技术社区  ›  Zabs

Docker-如何更改我的Docker Compose文件以自动生成MySQL容器的bash脚本?

  •  0
  • Zabs  · 技术社区  · 6 年前

    我有下面的安装程序Docker Composer,我想运行一个shell脚本来自动执行任务,比如将DB导入MySQL数据库。

    # Adopt version 2 syntax:
    version: '2'
    
    volumes:
        database_data:
            driver: local
    
    services:
    ###########################
    # Setup the Nginx container
    ###########################
    nginx:
        image: nginx:latest
        ports:
            - 8080:80
        volumes:
            - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
        volumes_from:
            - php
    
    ###########################
    # Setup the PHP container
    ###########################
    php:
        build: ./docker/php/
        expose:
            - 9000
        volumes:
            - .:/var/www
    
    ###########################
    # Setup the Database (MySQL) container
    ###########################
    mysql:
        image: mysql:latest
        expose:
            - 3306
        volumes:
            - database_data:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: secret
            MYSQL_DATABASE: project
            MYSQL_USER: project
            MYSQL_PASSWORD: project
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Kevin Kopf    6 年前

    最好的解决方案是创建一个自定义Dockerfile,它扩展了 mysql 并添加一个定制的shell脚本,它可以满足您的需要。例如:

    开始嘘

    #!/bin/sh
    
    mysqld
    mysql -u project -ppropject project < /path/to/backup.sql
    

    别忘了加上你的名字 backup.sql 要么到你的Dockerfile,要么 docker-compose.yml

    现在,Dockerfile:

    FROM mysql:latest
    
    COPY start.sh /tmp/start.sh
    COPY backup.sql /path/to/backup.sql
    
    CMD ["/tmp/start.sh"]
    

    如果你改变主意 备份sql 通常,将其添加到Dockerfile是没有意义的。相反,把它放在下面 volumes 在里面 docker撰写。yml :

    mysql:
        build: .
        expose:
            - 3306
        volumes:
            - ./backup.sql:/path/to/backup.sql
            - database_data:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: secret
            MYSQL_DATABASE: project
            MYSQL_USER: project
            MYSQL_PASSWORD: project
    
        2
  •  0
  •   CantankerousBullMoose    6 年前

    可以 在原始映像中继续使用一个脚本:将安装脚本作为配置加载到容器中(使用长表单定义以便设置执行权限),然后覆盖入口点以运行脚本(一旦完成,可能会运行原始入口点脚本)。比如:

    mysql:
    image: mysql:latest
    expose:
        - 3306
    volumes:
        - database_data:/var/lib/mysql
    environment:
        MYSQL_ROOT_PASSWORD: secret
        MYSQL_DATABASE: project
        MYSQL_USER: project
        MYSQL_PASSWORD: project
    configs:
        - source: ./OverrideScript.sh
        target: /OverrideScript.sh
        #0777 will work too, but you can't write to it either way
        mode: 0555
    entrypoint: /OverrideScript.sh
    

    其他答案是正确的,正确的方法是塑造自己的形象。但是,如果覆盖脚本相对较小且轻量级,那么解决方法就不那么糟糕了,而且它使您不必在每次MySQL发布新映像时重建自定义映像。