如何在 docker-compse 中获取容器的 IP 地址

How to get IP address of container in docker-compse

我正在尝试 运行 fake_sqs gem 在开发中的 docker 容器中测试我的 SQS 集成,并让另一个应用程序向它发送消息。

我的 docker-compose 文件如下所示:

app:
  build: .
  command: bundle exec rails s Puma --port 3000 --binding 0.0.0.0
  volumes:
    - ./:/app
  ports:
     - 3000:3000
  links:
    - db:db
  environment:
    VIRTUAL_HOST: app.docker
    PGHOST: db
    PGUSER: postgres
    AWS_REGION: us-west-2
    AWS_QUEUE_NAME: my-queue
    AWS_ENDPOINT: http://aws.docker:4568/
fakesqs:
  build: .
  command: fake_sqs -p 4568
  volumes:
    - ./:/app
  ports:
     - 4568:4568
  links:
    - db:db
  environment:
    VIRTUAL_HOST: aws.docker
    PGHOST: db
    PGUSER: postgres
    AWS_REGION: us-west-2
db:
  image: postgres

这在一定程度上起作用。我可以使用 http://aws.docker:4568 url 向 fakesqs 发送消息。我试图解决的问题围绕着 fakesqs 容器的命令。如果你 运行 fake_sqs 正如我的文件中所写的那样,默认情况下它会将主机名设置为 0.0.0.0。这意味着当我使用 aws-sdk gem 请求队列 urls 时,fake_sqs 回复了错误的主机。

client = Aws::SQS::Client.new
client.get_queue_url(queue_name: 'my-queue').queue_url
# => http://0.0.0.0:4568/my-queue

我显然不能用这个url来发送消息。相反,url 需要是 fakesqs 容器的 IP。您可以使用 -o 选项(即 fake_sqs -o <IP_ADDRESS> -p 4568)设置主机 url。

如何访问 fakesqs 容器 IP 地址以放入命令中?我是否必须为该容器设置静态 IP 地址?还是我打算用另一种方式来做?

尝试使用主机名而不是 IP 地址。

从您的应用程序容器中将 link 添加到 fake_sqs

app:
  build: .
  command: bundle exec rails s Puma --port 3000 --binding 0.0.0.0
  volumes:
    - ./:/app
  ports:
     - 3000:3000
  links:
    - db:db
    - fake_sqs #add this line!
  environment:
    VIRTUAL_HOST: app.docker
    PGHOST: db
    PGUSER: postgres
    AWS_REGION: us-west-2
    AWS_QUEUE_NAME: my-queue

并尝试在您的应用容器中执行 fake_sqs -o fake_sqs -p 4568