Docker compose 仅当docker未启动时才启动它

Docker compose 仅当docker未启动时才启动它,docker-compose,Docker Compose,我有一个在docker中运行的服务。出于某些原因,我想在它上并行运行一套测试,例如集成测试和性能测试 我有一个docker-compose.yaml,看起来像这样: # My service - the thing under test in this scenario service: ports: - 4000:4000 ... # Integration tests integration: depends_on: - service ... #

我有一个在docker中运行的服务。出于某些原因,我想在它上并行运行一套测试,例如集成测试和性能测试

我有一个docker-compose.yaml,看起来像这样:

# My service - the thing under test in this scenario
service: 
  ports: 
    - 4000:4000
  ...

# Integration tests
integration:
  depends_on:
    - service
  ...


# Performance tests
performance:
  depends_on:
    - service
  ...

我想继续公开4000,以便docker world之外的组件可以与之交互。但是,当我并行运行这些测试时,其中一个测试会出现此错误

无法启动服务。。。0.0.0.0:4000失败:端口已在使用中


这是因为docker compose正在尝试为每个测试启动一个服务。是否可以告诉docker compose使用相同的服务实例?有没有更好的方法来达到同样的效果?

我已经为自己解决了这个问题,我将在这里为将来面临类似问题的任何人记录它

默认情况下,从服务发布端口是这里的问题。根据服务启动方式的上下文,可以发布或不发布端口。最好使用docker子网在docker容器之间进行通信

docker-compose.yaml现在看起来更像这样:

service:
  # no ports declaration
  ...

integration:
  depends_on:
    - service
  environment:
    - SERVICE_URL=http://service:4000
  ...

performance:
  depends_on:
    - service
  environment:
    - SERVICE_URL=http://service:4000
  ...
相反,端口会在需要时发布,无论启动服务的是什么:

docker-compose run -p 4000:4000 service

我已经为自己解决了这个问题,我将在这里为将来面临类似问题的任何人记录它

默认情况下,从服务发布端口是这里的问题。根据服务启动方式的上下文,可以发布或不发布端口。最好使用docker子网在docker容器之间进行通信

docker-compose.yaml现在看起来更像这样:

service:
  # no ports declaration
  ...

integration:
  depends_on:
    - service
  environment:
    - SERVICE_URL=http://service:4000
  ...

performance:
  depends_on:
    - service
  environment:
    - SERVICE_URL=http://service:4000
  ...
相反,端口会在需要时发布,无论启动服务的是什么:

docker-compose run -p 4000:4000 service