Env-файл и MariaDB в docker-compose

Я пытаюсь настроить nextcloud на Raspberry Pi 3B + с MariaDB, примерно следуя этому примеру:

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

После запуска docker-compose up из каталога, в котором находятся файлы yaml и env, два контейнера запускаются нормально. Увы, соединение с базой данных не может быть установлено, потому что контейнер db принимает только пустой пароль (появление оболочки в контейнере и запуск mysql -u nextcloud без ввода пароля дает мне доступ к базе данных). Тем не менее, переменная среды $ MYSQL_ROOT_PASSWORD может быть корректно выведена из контейнера.

Если я запустил mariadb-образ только с docker run -e MYSQL_ROOT_PASSWORD=secure-password, все будет вести себя так, как ожидалось.

Может ли кто-нибудь указать мне на мою ошибку?

есть та же проблема

Psi 21.03.2019 12:42
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
1
6 303
2

Ответы 2

Я знаю, что это очень поздний ответ, но я только что наткнулся на него, когда гуглил что-то совершенно не связанное с этим.

Если я правильно помню, вы должны указать docker-compose, чтобы фактически отправлять переменные ENV в докер, просто объявив их в среде.

environment:
      - MYSQL_HOST=db
      - MYSQL_PASSWORD
      - MYSQL_USER

Я никогда не объявлял .env-файл в docker-compose, так что, возможно, это уже решает эту проблему. Я использую его таким образом (у меня также есть файл .env, из которого я иногда переопределяю некоторые значения).

Пример из моего контейнера MariaDB разработчика:

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

Некоторое время назад я наконец вылечил свою установку. К сожалению, я больше не могу реконструировать, в чем был трюк (и мои сообщения 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!

Другие вопросы по теме