连接在Dockerfile中被拒绝,但在中执行时未被拒绝

连接在Dockerfile中被拒绝,但在中执行时未被拒绝,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我有一个调用本地docker容器服务器的命令 我使用docker-compose-run-name\u of\u-service/bin/bash执行到一个图像中,从那里调用下面的命令可以正常工作 pip install --trusted-host pypi --extra-index-url http://pypi:8000 -r requirements.txt 但在Dockerfile中运行几乎相同的命令会导致重试错误 RUN pip install --trusted-host py

我有一个调用本地docker容器服务器的命令

我使用
docker-compose-run-name\u of\u-service/bin/bash
执行到一个图像中,从那里调用下面的命令可以正常工作

pip install --trusted-host pypi --extra-index-url http://pypi:8000 -r requirements.txt
但在Dockerfile中运行几乎相同的命令会导致重试错误

RUN pip install --trusted-host pypi --extra-index-url http://pypi:8000 -r requirements.txt --user

Dockerfile
RUN
指令永远不能对其他服务进行网络调用,即使在同一个
docker compose.yml
文件中也是如此。您需要安排包服务器在“其他地方”运行(即使是在Docker中,但单独启动也可能有效)

在技术层面,有两个问题。Compose假定所有映像生成都发生在任何容器启动之前,因此在生成
服务
映像之前无法要求启动
pypi
服务(
取决于:
不影响构建阶段)。映像构建也没有连接到Compose创建的Docker网络,因此它们不能执行诸如解析容器主机名之类的操作;这将导致您得到的特定错误

可以将其拆分为两个单独的composeYAML文件,一个用于包服务器,另一个用于主服务。您可以启动包服务器;然后docker编写构建主服务;然后停止包服务器。由于您已发布
端口:
您可以通过主机的一个IP地址访问包服务器;或者,如果您在MacOS或Windows主机上,则使用特殊主机名
host.docker.internal
;或者使用中描述的技术之一


(根据此包服务器中的具体内容,您可能根本不需要它。如果您
python setup.py bdist_wheel
pip wheel
保留在那里的依赖项,您可以
将生成的
.whl
文件复制到映像中并直接安装。如果所有文件都来自同一源代码树,则可以使用多个源代码。)-阶段构建,早期阶段只构建库也可以工作。)

他们是同一个docker compose.yml吗?@Stefano是的,是同一个docker compose.yml。是否有可能将yaml的两个版本添加到Post中?感谢如此详细的回答!我的计划是将此服务部署到一个网站并调用它,但我还没有得到它,所以在本地进行。关于复制轮子,有一个命令可以启动将控制盘加载到远程存储库中,我发现这比将它们移动到服务器或在包中进行更容易。
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPConnection object at 0x7f54bac2dad0>: Failed to establish a new connection: [Errno -2] Name or service not known')': /custom-utils/
  service:
    image: service:20.10.1
    build:
      context: platform
      dockerfile: service/Dockerfile
    depends_on:
      - api
      - pypi
    environment:
      PORT: "8088"
    ports:
      - "8088:8088"
    volumes:
      - some_location_of_source
    restart: always

  pypi:
    image: pypi:20.10.1
    build:
      context: services/pypi
      dockerfile: Dockerfile
    environment:
      PORT: "8000"
    expose:
      - "8000"
    ports:
      - "8000:8000"
    volumes:
      - some_location_of_source
RUN pip install \
  --extra-index-url http://host.docker.internal:8000 \
  -r requirements.txt