我有一个docker compose文件,其中包含我的容器以及rabbitmq。这是我的docker-compose.yml文件的精简版本,我在其中使用container_name和链接关键字从容器中访问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拉比tmq服务器
ping rabbitmq.server
有没有办法使用此链接访问rabbitmq-默认用户名和密码?还是我必须将它们作为单独的环境变量传递?(如果可能的话,我想避免这种重复(
您应该使用环境变量传递它们。Docker链接在这一点上是一个过时的功能,我建议直接删除您在docker-compose.yml
文件中留下的任何links:
。Compose为您设置网络,以便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链接功能确实会重新发布环境变量。我不会利用这一点——这在很多方面都是信息泄露,与应用程序自身的环境变量存在潜在冲突,链接功能通常被认为是过时的——但理论上可以使用
services:
rabbitmq:
environment:
RABBITMQ_DEFAULT_USER: guest
my-app:
links: [rabbitmq]
docker-compose run my-app sh -c 'echo $RABBITMQ_DEFAULT_USER'
这将取决于您的应用程序设置来理解RabbitMQ映像设置变量。