【问题标题】:Docker-compose: Database is uninitializedDocker-compose:数据库未初始化
【发布时间】:2016-09-24 16:21:00
【问题描述】:

我对 docker-compose 和 mysql 有疑问:

docker-compose.yml

version: '2' 
  services:
   db:
    image: mysql
    volumes:
      - "./sito/db/:/var/lib/mysql"
    ports:
      - "3306:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD:

   app:
    depends_on:
      - db
    image: eboraas/apache-php
    links:
      - db
    ports:
      - "80:80"
    volumes:
      - ./sito/:/var/www/html/

编写此容器时发生错误:

Recreating phpapp_phpapache_1
Attaching to phpapp_db_1, phpapp_phpapache_1
db_1 | error: database is uninitialized and password option is not specified 
db_1 | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
phpapache_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.30.0.3. Set the 'ServerName' directive globally to suppress this message
phpapp_db_1 exited with code 1
db_1 | error: database is uninitialized and password option is not specified 
db_1 | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
db_1 | error: database is uninitialized and password option is not specified 
db_1 | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
db_1 | error: database is uninitialized and password option is not specified 
db_1 | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
db_1 | error: database is uninitialized and password option is not specified

但是数据库没有密码。我该如何解决?

【问题讨论】:

标签: mysql docker docker-compose


【解决方案1】:

根据documentation,您必须使用 -= 而不是 MYSQL_ROOT_PASSWORD:,而且您还应该使用“密码” 结果会是:

- MYSQL_ROOT_PASSWORD=some_password

在你的例子中:

version: '2' 
  services:
   db:
    image: mysql
    volumes:
      - "./sito/db/:/var/lib/mysql"
    ports:
      - "3306:3306"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=some_password

【讨论】:

    【解决方案2】:

    我只是想指出一点,如果在终端中使用docker run 命令而不是 docker-compose,这将是命令:

    docker run -e MYSQL_ROOT_PASSWORD=password mysql_image
    

    请注意,如果您将-e MYSQL_ROOT_PASSWORD=password 放在mysql_image 之后,它将不起作用

    【讨论】:

      【解决方案3】:

      如果您不为MYSQL_ROOT_PASSWORD 指定值,则会出现该问题(其他情况如下所述)。

      您可以使用以下语法之一:

      # syntax 1
      environment:
        MYSQL_ROOT_PASSWORD: strongrootpassword
      
      # syntax 2
      environment:
       - MYSQL_ROOT_PASSWORD=strongrootpassword
      

      如果您希望使用空白/空密码,请使用以下内容:

      MYSQL_ALLOW_EMPTY_PASSWORD=1
      

      如果您想设置随机密码,请使用以下命令:

      MYSQL_RANDOM_ROOT_PASSWORD=1
      

      然后就可以使用生成的密码了

      docker logs container_name_or_id 
      

      最后你需要根据MySQL镜像的入口点指定MYSQL_ROOT_PASSWORDMYSQL_ALLOW_EMPTY_PASSWORDMYSQL_RANDOM_ROOT_PASSWORD中的一个

      • -z是验证变量不为空
      if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
          echo >&2 'error: database is uninitialized and password option is not specified '
          echo >&2 '  You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD'
          exit 1
      fi
      

      【讨论】:

      • 您好 Mostafa,我无法使用 `docker logs 访问生成的密码,我该如何访问密码?
      【解决方案4】:

      您似乎将MYSQL_ROOT_PASSWORD 设置为空。根据文档,它是必需的。

      https://hub.docker.com/_/mysql/

      MYSQL_ROOT_PASSWORD

      此变量是强制性的,它指定将为 MySQL root 超级用户帐户设置的密码。

      【讨论】:

      • 太棒了……你是怎么做到的? docker run -e MYSQL_ROOT_PASSWORD=root 不起作用
      • 它确实有效。看官方文档。如果您在容器中运行printenv,您应该会看到设置的环境变量。 hub.docker.com/_/mysql
      【解决方案5】:

      我们可以使用

      docker container run -d --name mysql -e MYSQL_RANDOM_ROOT_PASSWORD=password mysql
      

      您可以提供任何名称和任何密码

      【讨论】:

      【解决方案6】:

      以防万一有人像我一样来到这里

      docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
      

      在这里休息https://hub.docker.com/_/mysql

      【讨论】:

        【解决方案7】:

        如前所述,为environment 部分中的MYSQL_ROOT_PASSWORD 项目分配一个实际值。有关我之前使用的示例的参考,请参见此处:

        https://github.com/alexmacarthur/local-docker-db/blob/master/mysql/docker-compose.yml#L12

        如果您不想将密码存储在您的 docker-compose.yml 文件中,您也可以传递一个包含该值的 .env 文件,然后在您的存储库中忽略该文件。这里有一个可能看起来如何的示例(使用 DyanmoDB,但它是相同的概念):

        https://github.com/alexmacarthur/local-docker-db/blob/master/dynamo/docker-compose.yml#L17

        【讨论】:

          【解决方案8】:

          您还可以添加健康检查以确保您的数据库在您的 php 应用程序启动之前可用

          db:
          image: mysql
          container_name: ${MYSQL_SERVER_NAME}
          ports:
              - "${MYSQL_LOCALPORT}:${MYSQL_PORT}"
          environment:
              - "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}"
              - "MYSQL_USER=${MYSQL_USER}"
              - "MYSQL_PASSWORD=${MYSQL_PASSWORD}"
          healthcheck:
                  test: ["CMD", "mysqladmin" ,"ping", "-h", "${MYSQL_SERVER_NAME}"]
                  timeout: 10s
                  retries: 10
          restart: always
          

          并将其添加到您的应用中:

              depends_on: 
              db:
                  condition: service_healthy
          

          【讨论】:

            【解决方案9】:

            我只是像下面这样指定密码,它就可以神奇地工作。我不知道我应该使用现有用户吗?
            MYSQL_USER:根 MYSQL_密码:1 MYSQL_ROOT_PASSWORD:1

            【讨论】:

            • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
            • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-23
            • 2019-06-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多