首页 > 解决方案 > Docker:未创建数据库

问题描述

我正在运行我的docker-compose.yml文件,当我运行时 docker-compose --verbose up --build出现错误:
Host 'websites_backend_1.websites_default' is not allowed to connect to this MySQL server
那是因为数据库没有正确构建。当我查看数据库的日志时,我看到:

{"log":"2020-07-17T20:47:32.048295Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.\n","stream":"stderr","time":"2020-07-17T20:47:32.048692809Z"}
{"log":"2020-07-17T20:47:32.048574Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.\n","stream":"stderr","time":"2020-07-17T20:47:32.048985478Z"}
{"log":"2020-07-17T20:47:32.053617Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.\n","stream":"stderr","time":"2020-07-17T20:47:32.054070073Z"}
{"log":"2020-07-17T20:47:32.074099Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.21'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.\n","stream":"stderr","time":"2020-07-17T20:47:32.07428149Z"}
{"log":"2020-07-17T20:57:31.584660Z 0 [System] [MY-013172] [Server] Received SHUTDOWN from user \u003cvia user signal\u003e. Shutting down mysqld (Version: 8.0.21).\n","stream":"stderr","time":"2020-07-17T20:57:31.584841262Z"}
{"log":"2020-07-17T20:57:32.156022Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.21)  MySQL Community Server - GPL.\n","stream":"stderr","time":"2020-07-17T20:57:32.156200018Z"}

我的./mysql目录- "./mysql:/var/lib/mysql"是空的

docker container ls生产

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
6b418818c780        websites_frontend   "docker-entrypoint.s…"   49 seconds ago      Up 48 seconds       0.0.0.0:3002->3000/tcp              websites_frontend_1
389d86543214        websites_backend    "python3 manage.py r…"   50 seconds ago      Up 49 seconds       0.0.0.0:8000->8000/tcp              websites_backend_1
03ab9131cf37        mysql:latest        "docker-entrypoint.s…"   24 minutes ago      Up 50 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   websites_db_1
d03eb504da0f        memcached           "memcached '-m 64'"      About an hour ago   Up 50 seconds       0.0.0.0:11211->11211/tcp            websites_cache_1 

当我做docker exec -it websites_db_1 bash
我能做show databases但看不到my_database

在本地,我的 docker 项目正在运行,但在我的服务器上却没有。

为什么会这样?我想不通。

docker-compose.yml

version: "3.2"
services:
  backend:
    build: ./backend
    volumes:
      - ./backend:/app/backend
    ports:
      - "8000:8000"
    stdin_open: true
    tty: true
    command: python3 manage.py runserver 0.0.0.0:8000
    depends_on:
      - db
      - cache
    links:
      - db
  frontend:
    build: ./frontend
    volumes:
      - ./frontend:/app
       #One-way volume to use node_modules from inside image
      - /app/node_modules
    ports:
      - "3002:3000"
    environment:
      - NODE_ENV=development
      - CHOKIDAR_USEPOLLING=true
    depends_on:
      - backend
    tty: true
    command: npm start


  db:
    image: mysql:latest
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - "./mysql:/var/lib/mysql"
      - "./.data/conf:/etc/mysql/conf.d"
    ports:
      - "3306:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: my_database
      MYSQL_USER: root
      MYSQL_PASSWORD: root

  cache:
    image: memcached
    ports:
      - "11211:11211"
    expose:
      - "11211"
    entrypoint:
      - memcached
      - -m 64

volumes:
    mysql: {}

标签: mysqldocker

解决方案


我去过那里,它很容易但不推荐在 PRODUCTION上运行,当您第一次运行 Mysql 容器(在您的情况下为 db)时,它会在 .mysql 上创建一些文件,因为您在卷上定义了这些文件:

volumes:
      - "./mysql:/var/lib/mysql"
      - "./.data/conf:/etc/mysql/conf.d"

因此,当您再次运行它时,文件就在那里,并且假设它已经有信息,docker 会跳过数据库的创建。

因此,要修复它,只需删除您机器上 .mysql 文件夹的内容并重新运行您的容器。

简化该过程的运行

从不(从不)在生产中运行

docker-compose rm -fv;
rm -rf .mysql/*

但请记住不要在生产中运行。


推荐阅读