【问题标题】:How to execute a Bash script into a mysql docker container every time it starts如何在每次启动时将 Bash 脚本执行到 mysql docker 容器中
【发布时间】:2022-01-09 23:50:20
【问题描述】:

我需要在每次启动时执行这些命令,因为每次设置并重新启动它时它看起来都会被覆盖

mysql -uroot -padmin;
set global general_log = 1;

我仅出于开发目的使用 docker-compose 启动 docker 容器,它看起来像这样。

version: "3.8"
services:
  mysql_service:
    container_name: db_container
    build:
        context: .
        dockerfile: ./db/Dockerfile.dev
    # needed for mysql 8+
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    hostname: db
    ports:
      - target: 3306
        published: 3306
        protocol: tcp
        mode: host
    environment:
      - MYSQL_ROOT_PASSWORD=admin
      - MYSQL_DATABASE=example
      - MYSQL_ROOT_HOST=localhost
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - ./db/:/docker-entrypoint-initdb.d/
      - data_volume:/var/lib/mysql/
    cap_add:
      - ALL
      
volumes:
  data_volume:
    driver: local

和 Dockerfile

FROM mysql:8.0

COPY ./DevOps/Docker/db/set_logging.sh /usr/local/bin
ENTRYPOINT ["docker-entrypoint.sh", "./usr/local/bin/set_logging.sh"]

但是,副本通过但脚本从未执行。 脚本的样子

#!/bin/bash
mysql -uroot -padmin -e "set global general_log = 1"

关于让这个命令通过的任何建议?这只是为了开发

【问题讨论】:

  • 这里不是唯一的选择,而是最简单的选择。放弃您为尝试解决此问题所做的所有工作,只需将 --general-log=1 添加到您的 docker-compose 文件中的服务命令中。要查看所有配置选项的列表,您可以在 docker 命令行上为 mysql:8.0 设置,而无需将自定义配置推送到您的容器:docker run -it --rm mysql:8.0 --verbose --helpofficial mysql docker image documentation 有更多关于如何为各种用例自定义容器的信息。
  • 天哪,我不知道你可以在 docker-compose 文件的 - command 部分有多个命令。

标签: mysql bash docker docker-compose


【解决方案1】:

为了告诉 MYSQL 容器在启动后运行该脚本,您可以使用 docker 文件或 docker-compose 文件将脚本挂载到映像的 /docker-entrypoint-initdb.d 文件夹中使用绑定挂载卷。

Dockerfile

FROM mysql:8.0
COPY ./DevOps/Docker/db/script.sh /docker-entrypoint-initdb.d/script.sh
ENTRYPOINT ["docker-entrypoint.sh"]

docker-compose

version: "3.8"
services:
  mysql_service:
    container_name: db_container
    build:
        context: .
        dockerfile: ./db/Dockerfile.dev
    # needed for mysql 8+
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    hostname: db
    ports:
      - target: 3306
        published: 3306
        protocol: tcp
        mode: host
    environment:
      - MYSQL_ROOT_PASSWORD=admin
      - MYSQL_DATABASE=example
      - MYSQL_ROOT_HOST=localhost
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - "./DevOps/Docker/db/script.sh:/docker-entrypoint-initdb.d/script.sh"  
      - data_volume:/var/lib/mysql/
    cap_add:
      - ALL
      
volumes:
  data_volume:
    driver: local

您可以在 /docker-entrypoint-initdb.d 中查看脚本是如何启动的,请阅读 Initializing a fresh instance 部分

【讨论】:

  • 我已经尝试在initdb.d 脚本中使用set global general_log = 1;,但这不起作用。我在那个文件中有我的数据库的所有初始化。如您所见,这个答案也是我的代码中已经实现的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2017-12-03
  • 2018-03-20
  • 2021-08-15
  • 2017-12-01
  • 1970-01-01
相关资源
最近更新 更多