【问题标题】:env-file and MariaDB in docker-composedocker-compose 中的 env 文件和 MariaDB
【发布时间】:2018-12-25 10:10:10
【问题描述】:

我正在尝试使用 MariaDB 在 Raspberry Pi 3B+ 上设置 nextcloud,大致遵循以下示例:

https://github.com/nextcloud/docker/blob/master/.examples/docker-compose/with-nginx-proxy/mariadb/apache/docker-compose.yml

我的撰写文件如下所示:

version: '3'

services:
  db:
    image: mariadb
    env_file:
    - pi.env
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: always
    volumes:
      - ${BASE_PATH}/db:/var/lib/mysql

  nextcloud:
    image: nextcloud:apache
    env_file:
      - pi.env
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes: 
      - ${BASE_PATH}/www:/var/www
    depends_on:
      - db
    environment:
      - MYSQL_HOST=db

然后是 pi.env 文件:

MYSQL_PASSWORD=secure-password
MYSQL_ROOT_PASSWORD=even-more-secure.password
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud
BASE_PATH=/tmp

从 yaml 和 env 文件所在的目录运行 docker-compose up 后,两个容器启动正常。唉,无法建立数据库连接,因为 db-container 只接受空白密码(在容器中弹出一个 shell 并运行mysql -u nextcloud 而无需输入密码就可以访问数据库)。尽管如此,$MYSQL_ROOT_PASSWORD 环境变量仍然可以从容器中正确回显。

如果我单独使用 docker run -e MYSQL_ROOT_PASSWORD=secure-password 启动 mariadb-image,一切都会按预期运行。

谁能指出我的错误?

【问题讨论】:

  • 遇到同样的问题

标签: docker docker-compose mariadb


【解决方案1】:

我终于在不久前修复了我的设置。可悲的是,我无法再重构出什么伎俩了(而且我的 git commit 消息对我未来的自己来说并不像我希望的那样清晰:D)。

但在我看来,在 pi.env 文件而不是 docker-compose.yaml 中专门声明数据库密码的环境变量可以解决问题。

我的 docker-compose.yaml:

services:
  db:
    image: jsurf/rpi-mariadb
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
    restart: always

    volumes:
      - db:/var/lib/mysql
    env_file:
      - pi.env

  nextcloud:
    image: nextcloud:apache
    restart: always
    container_name: nextcloud
    volumes: 
      - www:/var/www/html
    environment:
      - VIRTUAL_HOST=${VIRTUAL_HOST}
      - LETSENCRYPT_HOST=${VIRTUAL_HOST}
      - LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL}
      - MYSQL_HOST=db
      - NEXTCLOUD_TRUSTED_DOMAINS=${VIRTUAL_HOST}
      - NEXTCLOUD_TRUSTED_DOMAINS=proxy
    env_file:
      - pi.env
    depends_on:
      - db
    networks:
      - proxy-tier
      - default

pi.env:

MYSQL_PASSWORD=secure-password
MYSQL_ROOT_PASSWORD=even-more-secure.password
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud

但还是要感谢@Zandorin!

【讨论】:

    【解决方案2】:

    我知道这是一个非常晚的答案,但我只是在谷歌搜索完全不相关的东西时偶然发现了这个。

    如果我没记错的话,您必须通过在环境中声明它们来告诉 docker-compose 将 ENV 变量实际发送到 docker。

    environment:
          - MYSQL_HOST=db
          - MYSQL_PASSWORD
          - MYSQL_USER
    

    我从未在 docker-compose 中声明过 .env 文件,所以也许这已经解决了这个问题。我以这种方式使用它(我还有一个 .env 文件,然后我有时会覆盖其中的一些值)。

    来自我的开发者 MariaDB 容器的示例:

     environment:
          - MYSQL_DATABASE=mydb
          - MYSQL_USER=${DB_USER}
          - MYSQL_PASSWORD=${DB_PASSWORD}
          - MYSQL_ROOT_PASSWORD
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2023-01-17
      相关资源
      最近更新 更多