0

我有以下设置 Docker Composer 设置并希望运行一个 shell 脚本来自动执行诸如将数据库导入 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
4

2 回答 2

2

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

启动.sh

#!/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"]

如果您backup.sql经常更改,将其添加到 Dockerfile 是没有意义的。相反,把它放在volumes下面docker-compose.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
于 2018-08-31T13:35:14.747 回答
0

可以继续使用原始图像:将您的设置脚本作为配置加载到容器中(使用长格式定义,以便您可以设置执行权限),然后覆盖入口点以运行您的脚本(这可能应该运行完成后的原始入口点脚本)。所以像:

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

其他答案是正确的,“正确”的方式是制作自己的形象。但是 TBH 如果您的覆盖脚本相对较小且轻量级,那么解决方法也不是那么糟糕,并且它使您不必在每次 MySQL 发布新映像时都重新构建您的自定义映像。

于 2018-08-31T18:21:03.327 回答