如何使用 docker-compose 链接从另一个容器中访问用户名和密码详细信息

How to use docker-compose links to access username and password details from inside another container

我有一个 docker-compose 文件,其中包含我的容器和 rabbitmq 的详细信息。 这是我的 docker-compose.yml 文件的简化版本,我在其中使用 container_namelinks 关键字从我的容器中访问 rabbitmq 的 IP 地址。

version: "3.2"

environment:
    &my-env
    My_TEST_VAR1: 'test_1'
    My_TEST_VAR2: 'test_2'

rabbitmq:
    container_name: rabbitmq
    image: 'rabbitmq:3.6-management-alpine'
    ports:
      - '5672:5672'
      - '15672:15672'
    environment:
      AMQP_URL: 'amqp://rabbitmq?connection_attempts=5&retry_delay=5'
      RABBITMQ_DEFAULT_USER: "guest"
      RABBITMQ_DEFAULT_PASS: "guest"

  my-service:
    tty: true
    image: my_image_name:latest
    working_dir: /opt/services/my_service/
    command: python3.8 my_script.py
    ports:
      - 9000:9000
    links:
      - rabbitmq:rabbitmq.server
    environment:
      <<: *my-env

在我的容器中,我可以通过以下方式成功 ping rabbitmq 服务器:

ping rabbitmq.server

有什么方法可以使用此 link 访问 rabbitmq 默认 用户名密码?或者我是否必须将它们作为单独的 environment 变量传递? (如果可能的话,我想避免这种重复)

您应该使用环境变量传递它们。 Docker 链接在这一点上是一个过时的功能,我建议直接删除您留在 docker-compose.yml 文件中的任何 links:。 Compose sets up networking for you 以便 Compose 服务名称 rabbitmqmy-server 可以用作容器之间的主机名,而无需任何特殊设置;链接提供的环境变量令人困惑,可能会无意中泄露数据。

如果你想避免重复,你可以使用已有的 YAML 锚点语法,或者将环境变量写入一个单独的 env_file:。除非你有很多设置或很多容器,否则将它们写在 docker-compose.yml 文件中是最简单的。

version: '3.8'
services:
  rabbitmq:
    image: 'rabbitmq:3.6-management-alpine'
    ports:
      - '5672:5672'
      - '15672:15672'
    environment:
      RABBITMQ_DEFAULT_USER: "guest"
      RABBITMQ_DEFAULT_PASS: "guest"
    # You may want volumes: to persist the queue.
    # As a special case for RabbitMQ only, you would need a hostname:.

  my-service:
    image: my_image_name:latest
    ports:
      - 9000:9000
    environment:
      # I'd just write these out.
      My_TEST_VAR1: 'test_1'
      My_TEST_VAR2: 'test_2'
      RABBITMQ_HOST: rabbitmq
      RABBITMQ_USER: guest
      RABBITMQ_PASSWORD: guest
    # working_dir: and command: should be in your Dockerfile as
    # WORKDIR and CMD respectively.  links: is obsolete.

原则上,您可以将锚点附加到任何 YAML 节点,但如果我正在阅读它,我会发现语法有点混乱。我倾向于避免这样的语法,但它在技术上是一种选择。

services:
  rabbitmq:
    environment:
      RABBITMQ_DEFAULT_USER: &rabbitmq_user guest
  my-app:
    environment:
      RABBITMQ_USER: *rabbitmq_user

最后,我最初暗示过时的 Docker 链接功能可以 republish environment variables。我不会利用这一点——它在很多方面都是信息泄漏,与应用程序自身的环境变量存在潜在冲突,并且链接功能通常被认为已过时——但理论上可以使用它

services:
  rabbitmq:
    environment:
      RABBITMQ_DEFAULT_USER: guest
  my-app:
    links: [rabbitmq]
docker-compose run my-app sh -c 'echo $RABBITMQ_DEFAULT_USER'

了解 RabbitMQ 图像设置变量取决于您的应用程序设置。