122

docker-compose用来运行一个测试环境,它由大约 5 个不同的容器组成。容器间链接和共享卷(volumes-from)工作得很好。我还将一些端口暴露给主机,效果很好。

我缺少的是一种将我的一些真实服务器链接到这个环境的方法,而无需硬编码 IP 地址。使用docker run,您可以使用--add-host在文件中添加另一行/etc/hosts。有没有办法用 docker-compose 做类似的事情?

4

4 回答 4

119

我有个好消息:这将在 Compose 1.3 中!

我在当前的 RC (RC1) 中使用它,如下所示:

rng:
  build: rng
  extra_hosts:
    seed: 1.2.3.4
    tree: 4.3.2.1
于 2015-05-30T01:56:30.807 回答
110

https://github.com/compose-spec/compose-spec/blob/master/spec.md#extra_hosts

extra_hosts - 添加主机名映射。使用与 docker 客户端 --add-host 参数相同的值。

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

将在 /etc/hosts > 中为此服务的容器内创建一个带有 ip 地址和主机名的条目,例如:

162.242.195.82  somehost
50.31.209.229   otherhost
于 2015-10-23T22:26:00.290 回答
34

基本docker-compose.yml额外主机

version: '3'
services:
api:
    build: .
    ports:
        - "5003:5003"
    extra_hosts:
        - "your-host.name.com:162.242.195.82" #host and ip
        - "your-host--1.name.com your-host--2.name.com:50.31.209.229" #multiple hostnames with same ip
        

创建的容器中的/etc/hosts文件内容:

162.242.195.82  your-host.name.com
50.31.209.229   your-host--1.name.com your-host--2.name.com

您可以/etc/hosts使用以下命令检查文件:

$ docker-compose -f path/to/file/docker-compose.yml run api bash  # 'api' is service name
#then inside container bash
root@f7c436910676:/app# cat /etc/hosts
于 2020-04-15T14:23:10.037 回答
0

似乎应该可以说:

extra_hosts:
 - "loghost:localhost"

因此,如果冒号后面的部分(通常是 IP 地址)不以数字开头,则将执行名称解析以查找 localhost 的 IP,并在容器的 /etc/hosts 中添加类似的内容:

127.0.0.1 日志主机

...假设 localhost 在主机系统上解析为 127.0.0.1 。

看起来很容易添加到 docker-compose 的源代码中:compose/config/types.py 的 parse_extra_hosts 函数可能会做到这一点。

对于 docker 本身,这可能可以添加到 opts/hosts.go 的 ValidateExtraHost 函数中,尽管它不再严格验证,因此该函数会有点错误命名。

将它添加到 docker 中实际上可能会更好一点,而不是 docker-compose - 如果 docker 获取它,docker-compose 可能会自动获取它。

遗憾的是,这可能需要容器反弹来更改 IP 地址。

于 2019-06-04T21:52:10.473 回答