Docker-compose 构建镜像时更新 /etc/hosts 的解决方法

48次阅读
没有评论

问题描述

在构建 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。下面是详细步骤:

步骤

  1. 确保你使用的是 Compose V2 版本,你可以通过以下命令来检查版本:
    bash
    docker-compose version

    如果没有 V2 版本,请升级到支持 V2 版本的 Compose。

  2. 使用以下命令构建镜像并启动容器:
    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 的情况下,实现类似的功能需求。如果未来有相关的更新或修复,你可能需要调整解决方案来适应新的情况。

希望这个解决方案能够帮助你解决问题。如果你有任何疑问或需要进一步的帮助,请随时提问。

正文完