启动 mysql docker 容器时设置 sql_mode 命令

问题描述 投票:0回答:2

我需要在 mysql 中设置此全局配置值,以允许日期字段中的零,自动设置为 docker 映像设置和配置的一部分。

设置全局 sql_mode='ALLOW_INVALID_DATES,NO_ZERO_DATE';

我尝试过的方法都没有成功。

我的环境:

  • ubuntu vps、laravel 项目
  • docker 容器(当我“docker-compose up -d --build nginx”以及 redis 等时,mysql 作为依赖项运行)

我尝试创建一个文件“sql_mode.cnf”,其中包含

设置全局 sql_mode='ALLOW_INVALID_DATES,NO_ZERO_DATE';

并通过 docker-compose.prod.yml 从 mysql.prod.dockerfile 调用该文件,如下所示,但它不起作用。可能存在文件访问错误问题?

这是正确的方法吗?还有更好的吗

docker-compose.prod.yml(摘录):

  mysql:
    build:
      context: .
      dockerfile: mysql.prod.dockerfile
    container_name: mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: database
      MYSQL_USER: datauser
      MYSQL_PASSWORD: pwd
      MYSQL_ROOT_PASSWORD: pwd
    networks:
      - laravel

mysql.prod.docker文件:

FROM mysql:8.0.32

COPY sql_mode.cnf /etc/mysql/conf.d/

RUN echo "SET GLOBAL sql_mode='ALLOW_INVALID_DATES,NO_ZERO_DATE';" > /docker-entrypoint-initdb.d/init_sql_mode.sql

sql_mode.cnf:

SET GLOBAL sql_mode='ALLOW_INVALID_DATES,NO_ZERO_DATE';

这是“docker log mysql”输出:

这是运行 docker 的日志。但日期设置中的零没有被占用。为什么?

remote: #3 [internal] load metadata for docker.io/library/mysql:8.0.32
remote: #3 DONE 0.0s
remote:
remote: #4 [1/3] FROM docker.io/library/mysql:8.0.32
remote: #4 CACHED
remote:
remote: #5 [internal] load build context
remote: #5 transferring context: 94B 0.5s done
remote: #5 DONE 0.6s
remote:
remote: #6 [2/3] COPY sql_mode.cnf /etc/mysql/conf.d/
remote: #6 DONE 0.1s
remote:
remote: #7 [3/3] RUN echo "SET GLOBAL sql_mode='ALLOW_INVALID_DATES,NO_ZERO_DATE';" > /docker-entrypoint-initdb.d/init_sql_mode.sql
remote: #7 DONE 0.7s
remote:
remote: #8 exporting to image
remote: #8 exporting layers 0.1s done

为什么这不起作用? 有更好的方法吗?我在网上没有找到任何有关如何设置的指南 - 有吗?

如果有任何帮助,我将非常感激 - 我已经为此工作了好几天了:-)

mysql laravel docker ubuntu global
2个回答
4
投票

你可以这样做:

mysql:
    build:
      context: .
      dockerfile: mysql.prod.dockerfile
    command: mysqld --sql_mode="ALLOW_INVALID_DATES,NO_ZERO_DATE"
    container_name: mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: database
      MYSQL_USER: datauser
      MYSQL_PASSWORD: pwd
      MYSQL_ROOT_PASSWORD: pwd
    networks:
      - laravel


0
投票

使用默认的 mysql docker 镜像,如下更容易做到:

services:
  db:
    image: mysql:latest
    container_name: db
    restart: unless-stopped
    ports:
      - "3306:3306"
    command:
      - --sql_mode=ALLOW_INVALID_DATES,NO_ZERO_DATE # Make sure to leave out the double quotes
    environment:
      MYSQL_DATABASE: database
      MYSQL_USER: datauser
      MYSQL_PASSWORD: pwd
      MYSQL_ROOT_PASSWORD: pwd
    networks:
      - laravel
© www.soinside.com 2019 - 2024. All rights reserved.