我在docker容器中运行了一个Web服务,可以在localhost:5000(主机)上访问它。我想在Dockerfile中调用此服务。我正在为.net核心应用程序使用多阶段Dockerfile。我想收集构建统计信息并发送到在localhost:5000运行的服务。到目前为止,建议的方法是使用--network =“ host”。但这在构建期间不起作用。
答案 0 :(得分:1)
多么奇怪! --network=host
应该达到您所建议的方法所期望的效果。我想知道为什么开箱即用对您不起作用。
我建议您测试此简化版本的问题,以消除Docker网络堆栈之外的潜在错误源:
docker run -d -p 5000:80 nginx
可以解决问题
FROM busybox
RUN echo localhost:5000
RUN wget localhost:5000
docker build --no-cache .
。如预期的那样,网络调用将失败,并且输出应包括:
wget:无法连接到远程主机(127.0.0.1):连接被拒绝
docker build --network=host --no-cache .
。对我来说,输出包括:
连接到localhost:5000(127.0.0.1:5000)
index.html 100%| ************************************ | 612 0:00:00 ETA
docker build --network=bridge --no-cache .
。同样,网络呼叫失败并显示:
wget:无法连接到远程主机(127.0.0.1):连接被拒绝
尝试此操作会得到什么?
以上示例中的重要说明:我在--no-cache
命令中包含了docker build
参数,以确保重建整个Dockerfile
。否则,docker只会从缓存中提取已构建的图像层,并忽略自您上次构建此Dockerfile以来对--network
参数所做的任何更改。
更重要的是,尽管network
选项是在映像构建时公开的(从最新的API版本开始),但是我不确定这种用法是否与最佳做法一致。 使用在实际Dockerfile之外传输构建统计信息的解决方案可能会更好。例如,运行docker build ...
的CI脚本可以收集该命令grep
的输出/ sed
获取特定统计信息,并将其传输到您的Web服务。
编辑:如何根据您的评论使用docker-compose 实现此目的。可悲的是,docker-compose文档并未对此做广告,但实际上支持--network
。 It was added in Compose YAML file format version 3.4,特别是in this PR。
下面是一个示例docker-compose.yml
:
version: '3.4'
services:
web:
build:
context: .
network: host
将其与示例Dockerfile
放在同一目录中,并确保nginx在单独的容器中,如上所述。
结果如下:
> docker-compose build --no-cache
Building web
Step 1/3 : FROM busybox
---> e1ddd7948a1c
Step 2/3 : RUN echo localhost:5000
---> Running in d5f0d712c188
localhost:5000
Removing intermediate container d5f0d712c188
---> 8aa9d974447f
Step 3/3 : RUN wget localhost:5000
---> Running in a10cee732e48
Connecting to localhost:5000 (127.0.0.1:5000)
index.html 100% |********************************| 612 0:00:00 ETA
Removing intermediate container a10cee732e48
---> 8a287d116b4b
Successfully built 8a287d116b4b
Successfully tagged dockerquestion_web:latest