【问题标题】:Database is not created on docker compose up -d数据库未在 docker compose up -d 上创建
【发布时间】:2022-11-18 13:57:45
【问题描述】:

我正在关注docs of mariadb。它说如果在 /docker-entrypoint-initdb.d 中找到 .sql 就应该创建数据库。 我正在 Oracle Virtual BOX VM 中的 Ubuntu 服务器上工作。 我的 docker-compose.yml 看起来像这样:

version: "3.9"

services:
  db:
    image: mariadb:10
    container_name: mariadb
    ports:
      - 3306:3306
    environment:
      - MYSQL_USER=user
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_PASSWORD=password
      - MARIADB_DATABASE=database // tried with MYSQL_DATABASE and without this line

    volumes:
      - "db_data:/var/lib/mysql"
      - ".database/initdb/dump.sql:/docker-entrypoint-initdb.d/initdb.sql"
    # networks:
    #   - network

volumes:
  db_data:

我的 initdb.sql 看起来像这样(最终应该工作的那个看起来不同但出于简单性我将它减少到最大值并且甚至不能这个简单的工作):

CREATE DATABASE NEWDB;

老实说,我现在不知道去哪里看或做什么,因为我到处寻找可能的解决方案,我发现这是应该工作的最低限度的例子。

我尝试重新启动 docker,删除所有容器、图像和卷,将 initdb.sql 修改为:

CREATE USER user WITH PASSWORD 'password';
CREATE DATABASE IF NOT EXISTS database;
GRANT ALL PRIVILEGES ON DATABASE database TO user;

但是当我 docker compose up 时数据库没有初始化。 我查看了容器,发现 initdb.sql 在那里。

编辑:它以某种方式起作用,当我 docker compose up with MARIADB_DATABASE=database 但脚本 initdb.sql 仍然不起作用时,这是最重要的事情,因为它设置了整个数据库。 (注意:最重要的是,我想设置另一个运行 PHP 脚本的 PHP 容器,以收集存储在上述 MariaDB 容器中的数据。MariaDB 与一个网站相连,该网站从容器)

【问题讨论】:

    标签: docker docker-compose oraclevm


    【解决方案1】:

    好吧,我正在使用以下堆栈,它对我来说很好用。

    PHP-阿帕奇:

    这是一个运行我所有php 脚本的 Apache 服务器。您可以将脚本放在./src 目录中,它会自动挂载到Apache 服务器的DocumentRoot 目录。

    D b:

    这是MariaDb的最新docker容器

    管理员:

    这是我用来创建和更改数据库的轻量级数据库浏览器。您只需访问localhost:8081,然后输入以下凭据即可。以这种方式管理数据库变得更加简单。

    用户名:root
    密码:例子

    version: '3.8'
    services:
      php-apache:
        container_name: php-apache
        build:
          context: .
          dockerfile: Dockerfile
        image: php:8.0-apache
        volumes:
          - ./src:/var/www/html/
        ports:
          - 8080:80
    
      db:
        image: mariadb
        restart: always
        environment:
          MARIADB_ROOT_PASSWORD: example
    
      adminer:
        image: adminer
        restart: always
        ports:
          - 8081:8080
    
    文件:

    这是一个简单的 docker 容器,它是从基础 php:8.0-apache 图像扩展而来的,其中安装了 mysql 扩展以支持 PDO

    FROM php:8.0-apache
    RUN docker-php-ext-install pdo_mysql
    RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
    RUN apt-get update && apt-get upgrade -y
    
    附言:

    在这里,您必须通过 Adminer 的 GUI 手动创建所有数据库。但如果你更喜欢通过SQLinitdb.sql查询,那就做我的客人吧。我刚刚提供了这个配置作为建议。

    【讨论】:

    • 首先,感谢您的帮助。 PHP 部分看起来很有趣。运行 PHP 脚本的 Dockerfile 中有什么?您是像连接普通数据库一样连接到 Docker 容器,还是有什么特别需要考虑的?
    • 啊是的,我错过Dockerfile真是太傻了。我会用它更新答案。是的,我确实像普通数据库系统一样连接到 docker 容器。您的PHP 脚本将能够通过在连接字符串中使用$servername = "db"; 来连接到数据库容器。另外,您可以通过访问adminer在外部修改数据库。请注意,我仅在当前项目中使用此数据库系统。如果您希望将它用作所有项目的全局数据库系统,这取决于您。
    • 谢谢你。这不完全是我需要的,但它有帮助。我会赞成你的 cmets 但我还需要两分。如果您对我的两个 cmet 投赞成票,我也可以对您的投赞成票。
    • 我不明白的一件事是为什么您将脚本从 ./src 移动到 /var/www/html,运行 dockerfile 并 furnage 您的 php-container 因为我看不到在容器中执行的任何脚本?您是否设法在 PHP 容器中执行 PHP 脚本,例如将数据存储在 mariadb docker 容器中?
    【解决方案2】:

    我想出了一个解决方案。我使用了 laravel 的基本图像(使用 <curl -s "https://laravel.build/project-name?with=mariadb" | sudo bash> 安装了 laravel 项目并对其进行了一些修改。所以这里是 docker-撰写.yml:

    # For more information: https://laravel.com/docs/sail
    version: '3'
    services:
        laravel.test:
            build:
                context: ./vendor/laravel/sail/runtimes/8.1
                dockerfile: Dockerfile
                args:
                    WWWGROUP: '${WWWGROUP}'
            image: sail-8.1/app
            extra_hosts:
                - 'host.docker.internal:host-gateway'
            ports:
                - '${APP_PORT:-80}:80'
                - '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
            environment:
                WWWUSER: '${WWWUSER}'
                LARAVEL_SAIL: 1
                XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
                XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
            volumes:
                - '.:/var/www/html'
            networks:
                - sail
            depends_on:
                - mariadb
        mariadb:
            image: 'mariadb:10'
            container_name: 'mariadb-10'
            ports:
                - '${FORWARD_DB_PORT:-3306}:3306'
            environment:
                MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
                MYSQL_ROOT_HOST: "%"
                MYSQL_DATABASE: '${DB_DATABASE}'
                MYSQL_USER: '${DB_USERNAME}'
                MYSQL_PASSWORD: '${DB_PASSWORD}'
                MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
            volumes:
                - 'sail-mariadb:/var/lib/mysql'
                - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
            networks:
                - sail
            healthcheck:
                test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
                retries: 3
                timeout: 5s
    networks:
        sail:
            driver: bridge
    volumes:
        sail-mariadb:
            driver: local
    
    

    在这里您可以看到“10-create-testing-database.sh”在启动时执行。我测试了这个容器,它创建了一个数据库,所以我只需要稍微修改一下,现在容器在容器启动时创建了一个数据库和表。这是“10-create-testing-database.sh”:

    #!/usr/bin/env bash
    mysql --user=root --password="$MYSQL_ROOT_PASSWORD" <<-EOSQL
        CREATE DATABASE IF NOT EXISTS database_name;
        GRANT ALL PRIVILEGES ON `testing%`.* TO '$MYSQL_USER'@'%';
        
        USE database_name;
    
        CREATE TABLE IF NOT EXISTS table_name(  
        table_entries ...
        );
    EOSQL
    

    我仍然不知道为什么我的初始设置不起作用。我看到的唯一区别是这个工作文件是一个 .sh 而不是工作文件是一个 .sql (这对我来说没有意义,但它是什么)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 2021-03-13
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多