docker-compose中的env文件和MariaDB

时间:2018-12-25 10:10:10

标签: docker docker-compose mariadb

我正在尝试使用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图像,那么一切都会按预期进行。

有人可以指出我的错误吗?

2 个答案:

答案 0 :(得分:0)

我知道这是一个超级晚的答案,但是我在搜寻完全不相关的内容时偶然发现了这个问题。

如果我没记错的话,您必须告诉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

答案 1 :(得分:0)

我终于在一段时间前治愈了我的设置。可悲的是,我无法再重新构造出这个技巧了(我的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

但谢谢你,@ Zanndorin少了!