如何使用 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_name 和 links 关键字从我的容器中访问 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 服务名称 rabbitmq
和 my-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 图像设置变量取决于您的应用程序设置。
我有一个 docker-compose 文件,其中包含我的容器和 rabbitmq 的详细信息。 这是我的 docker-compose.yml 文件的简化版本,我在其中使用 container_name 和 links 关键字从我的容器中访问 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 服务名称 rabbitmq
和 my-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 图像设置变量取决于您的应用程序设置。