问题描述
在构建 Docker 容器镜像时,我需要在主机 localhost 上访问一个服务。使用 docker
命令的 --add-host
选项可以在镜像构建时和容器运行时更新 /etc/hosts
文件。而在 docker-compose
命令中,类似的选项 extra_hosts
似乎只在容器运行时生效。那么如何在 Docker 镜像构建时启用这个功能?目前似乎还没有实现这个功能,有一个相关的特性请求:https://github.com/docker/compose/issues/7323。在这个问题解决之前,有什么解决办法吗?
最小工作示例
以下是我的 Dockerfile:
FROM python:3.8-slim-buster
RUN grep "host.docker.internal" /etc/hosts || echo "Missing"
CMD grep "host.docker.internal" /etc/hosts || echo "Missing"
以及 docker-compose.yml:
version: "3.9"
services:
test:
build: .
extra_hosts:
- "host.docker.internal:host-gateway"
使用以下命令运行 Docker:
docker build . --add-host host.docker.internal:host-gateway --no-cache -t test \
&& docker run --add-host host.docker.internal:host-gateway test
会输出:
172.17.0.1 host.docker.internal...
而使用以下命令运行 docker-compose:
docker-compose build --no-cache && docker-compose up
则会返回:
Missing...test_1 | 172.17.0.1 host.docker.internal...
解决方案
在 Docker Compose 构建镜像时更新 /etc/hosts
的功能需要使用 Compose V2。下面是详细步骤:
步骤
-
确保你使用的是 Compose V2 版本,你可以通过以下命令来检查版本:
bash
docker-compose version
如果没有 V2 版本,请升级到支持 V2 版本的 Compose。 -
使用以下命令构建镜像并启动容器:
bash
docker compose build --no-cache && docker compose up
请注意,这里的命令中使用空格代替了破折号。
示例
以下是在 Docker Compose 中使用 Compose V2 构建镜像并启动容器的示例:
version: "3.9"
services:
test:
build: .
extra_hosts:
- "host.docker.internal:host-gateway"
通过以上步骤,你可以在 Docker Compose 构建镜像时更新 /etc/hosts
,从而在容器运行时能够访问到主机 localhost 上的服务。
请注意,这是目前的解决办法,如果在未来的版本中有相关的更新或修复,你可能会采用其他方法来实现相同的功能。
请注意,由于 Docker Compose 版本和特性可能会有所不同,本解决方案适用于支持 Compose V2 版本的情况。在使用时请仔细阅读相关文档和更新。
结论
通过使用 Compose V2 版本,你可以在 Docker Compose 构建镜像时更新 /etc/hosts
,从而在容器运行时能够访问主机 localhost 上的服务。这个解决办法可以帮助你在目前无法在构建时更新 /etc/hosts
的情况下,实现类似的功能需求。如果未来有相关的更新或修复,你可能需要调整解决方案来适应新的情况。
希望这个解决方案能够帮助你解决问题。如果你有任何疑问或需要进一步的帮助,请随时提问。