docker-compose 重新启动后保留以前的环境变量

时间:2021-04-17 20:49:50

标签: macos docker docker-compose

我是一名经验丰富的软件开发人员,但对 docker 还很陌生。

我正在尝试使用 bitnami/magento 基础映像 (https://hub.docker.com/r/bitnami/magento) 为 Magento 2.4 构建开发环境。当我第一次下载 docker-compose.yml 并运行它时,一切正常。

注意:这不是 Magento 的问题。我认为使用的特定容器对我的问题来说是次要的。这是一个 docker/docker-compose on Mac 问题。

我使用的原始 docker-compose.yml 文件:

version: '2'
services:
  mariadb:
    image: docker.io/bitnami/mariadb:10.3
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - MARIADB_USER=bn_magento
      - MARIADB_DATABASE=bitnami_magento
    volumes:
      - 'mariadb_data:/bitnami/mariadb'
  magento:
    image: docker.io/bitnami/magento:2
    ports:
      - '80:8080'
      - '443:8443'
    environment:
      - MAGENTO_HOST=localhost
      - MAGENTO_DATABASE_HOST=mariadb
      - MAGENTO_DATABASE_PORT_NUMBER=3306
      - MAGENTO_DATABASE_USER=bn_magento
      - MAGENTO_DATABASE_NAME=bitnami_magento
      - ELASTICSEARCH_HOST=elasticsearch
      - ELASTICSEARCH_PORT_NUMBER=9200
      - ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - 'magento_data:/bitnami/magento'
    depends_on:
      - mariadb
      - elasticsearch
  elasticsearch:
    image: docker.io/bitnami/elasticsearch:6
    volumes:
      - 'elasticsearch_data:/bitnami/elasticsearch/data'
volumes:
  mariadb_data:
    driver: local
  magento_data:
    driver: local
  elasticsearch_data:
    driver: local

但后来我想进行调整,例如配置通过卷或 Magento 密码映射源代码的本地路径。为此,我通过添加用户:root(见下文)将容器重新配置为根容器。

我所做的是创建一个 .env 文件,在其中定义了一些变量,然后将它们应用到 docker-compose 文件中,如下所示:

.env 文件:

ENV_MAGENTO_PASS=admin

改编的yml文件(以添加ENV_MAGENTO_PASS为例):

  magento:
    image: docker.io/bitnami/magento:2
    user: root
    ports:
      - '80:8080'
      - '443:8443'
    environment:
      - MAGENTO_HOST=localhost
      - MAGENTO_DATABASE_HOST=mariadb
      - MAGENTO_DATABASE_PORT_NUMBER=3306
      - MAGENTO_DATABASE_USER=bn_magento
      - MAGENTO_DATABASE_NAME=bitnami_magento
      - MAGENTO_PASSWORD=${ENV_MAGENTO_PASS}
      - ELASTICSEARCH_HOST=elasticsearch
      - ELASTICSEARCH_PORT_NUMBER=9200
      - ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - /my/local/magento/devpath:/bitnami/magento
    depends_on:
      - mariadb
      - elasticsearch

我还在两个位置干预了 ALLOW_EMPTY_PASSWORD 选项并尝试通过变量更改卷映射,但意识到 - 很久以后 - 环境变量只能应用于 yml 文件中的值(右侧)侧,而不是在关键方面。

关键是,为了让这一切发挥作用,我不得不多次破坏和重建一切。我为此使用了一个 shell 脚本(注释行也是我尝试过的):

docker pull bitnami/magento:2.4.2
#curl -sSL https://raw.githubusercontent.com/bitnami/bitnami-docker-magento/master/docker-compose.yml > docker-compose.yml

#docker builder prune
#docker system prune -a

#docker-compose down
docker-compose rm -f -s -v
#docker rm -f magento2_magento_1 magento2_elasticsearch_1 magento2_mariadb_1
#docker volume rm $(docker volume ls -q)
docker rmi -f $(docker images | grep bitnami/ | tr -s ' ' | cut -d ' ' -f 3)
docker-compose build --no-cache
docker-compose up -d --force-recreate

如您所见,我通常尝试擦除所有内容、容器和图像,然后从头开始重新创建。然而,我无法让我的简单更改生效,并且在某些时候我意识到这是因为环境变量没有流行起来。或者有时,当我恢复更改时,一些先前声明的环境变量仍然存在(或不存在),因此无法通过所需的信息。

我尝试了您在脚本中看到的所有内容,甚至删除了所有缓存和图像,但有时旧的环境变量仍然存在!

例如,使用上面详述的配置,我在运行所有内容并在 magento 映像上执行 docker run 后收到此错误消息(因为容器已退出):

michaelheumann@Michaels-MacBook-Pro magento2 % docker run 0298768ce79e
mariadb 20:46:50.12
mariadb 20:46:50.12 Welcome to the Bitnami mariadb container
mariadb 20:46:50.12 Subscribe to project updates by watching https://github.com/bitnami/bitnami-docker-mariadb
mariadb 20:46:50.12 Submit issues and feature requests at https://github.com/bitnami/bitnami-docker-mariadb/issues
mariadb 20:46:50.12
mariadb 20:46:50.13 INFO  ==> ** Starting MariaDB setup **
mariadb 20:46:50.14 INFO  ==> Validating settings in MYSQL_*/MARIADB_* env vars
mariadb 20:46:50.14 ERROR ==> The MARIADB_ROOT_PASSWORD environment variable is empty or not set. Set the environment variable ALLOW_EMPTY_PASSWORD=yes to allow the container to be started with blank passwords. This is recommended only for development.

但是设置了ALLOW_EMPTY_PASSWORD!!

有人遇到过这样的问题吗?我在 MacOS Big Sur 上工作,我了解 Mac 上的 Docker 创建某种隐藏的虚拟机来表示 Docker 容器。莫非这就是环境不容易清理的原因?

有没有人有关于如何避免此类问题的建议或解释为什么会发生这种情况?

顺便说一句:有没有办法让我的卷的主机路径可配置?

抱歉阅读太长,感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

最后,环境变量的问题与我在单个图像上执行 docker run 而不是 docker-compose run 有关,所以消息真的不相关。

其他事情可能是音量的问题。我最终使用了这个 docker-composer.yml:

version: '2'
services:
  mariadb:
    image: docker.io/bitnami/mariadb:10.3
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - MARIADB_USER=bn_magento
      - MARIADB_DATABASE=bitnami_magento
    volumes:
      - 'mariadb_data:/bitnami/mariadb'
  magento:
    image: docker.io/bitnami/magento:2
    user: root
    ports:
      - '80:8080'
      - '443:8443'
    environment:
      - PHP_MEMORY_LIMIT=512m
      - MAGENTO_HOST=localhost
      - MAGENTO_DATABASE_HOST=mariadb
      - MAGENTO_DATABASE_PORT_NUMBER=3306
      - MAGENTO_DATABASE_USER=bn_magento
      - MAGENTO_DATABASE_NAME=bitnami_magento
      - ELASTICSEARCH_HOST=elasticsearch
      - ELASTICSEARCH_PORT_NUMBER=9200
      - ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - 'magento_data:/bitnami/magento'
    depends_on:
      - mariadb
      - elasticsearch
  elasticsearch:
    image: docker.io/bitnami/elasticsearch:6
    volumes:
      - 'elasticsearch_data:/bitnami/elasticsearch/data'
volumes:
  mariadb_data:
    driver: local
  magento_data:
    driver: local
    driver_opts:
      type: none
      device: ${ENV_MAGENTO_LOCAL_PATH}
      o: bind
  elasticsearch_data:
    driver: local

在我的 .env 文件中声明了 ENV_MAGENTO_LOCAL_PATH。

我需要在重建所有卷之前删除所有卷,然后它终于起作用了。

以防万一这样的事情发生在其他人身上。

相关问题