docker-如何修改我的docker compose文件来自动为mysql容器编写bash脚本?

kx1ctssn  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(529)

我有下面的安装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
oyxsuwqo

oyxsuwqo1#

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


# !/bin/sh

mysqld
mysql -u project -ppropject project < /path/to/backup.sql

别忘了加上你的名字 backup.sql 要么到你的文件里要么 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是没有意义的。相反,把它放在下面 volumesdocker-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
ig9co6j1

ig9co6j12#

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

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发布新映像时重建自定义映像。

相关问题