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

Mic*_*ann 5 macos docker docker-compose

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

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

注意:这不是 Magento 问题。我认为所使用的具体容器对于我的问题来说是次要的。这是 Mac 上的 docker/docker-compose 问题。

我使用的原始 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
Run Code Online (Sandbox Code Playgroud)

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

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

.env 文件:

ENV_MAGENTO_PASS=admin

Run Code Online (Sandbox Code Playgroud)

改编后的yml文件(添加ENV_MAGENTO_PASS作为示例):

ENV_MAGENTO_PASS=admin

Run Code Online (Sandbox Code Playgroud)

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

关键是,为了让这一切发挥作用,我必须多次销毁并重新创建所有内容。我为此使用了一个 shell 脚本(注释行也是我尝试过的):

  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
Run Code Online (Sandbox Code Playgroud)

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

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

例如,使用上面详细的配置,在运行所有内容并在 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.
Run Code Online (Sandbox Code Playgroud)

但 ALLOW_EMPTY_PASSWORD 已设置!

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

有谁对如何避免此类问题有建议或解释为什么会发生这种情况?

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

抱歉读了这么长时间,并感谢您的帮助。

Mic*_*ann 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
Run Code Online (Sandbox Code Playgroud)

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

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

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