我有一个docker compose文件,用于定义将运行我的应用程序的服务以及该应用程序依赖于运行的服务:
services:
frontend:
build:
context: .
volumes:
- "../.:/opt/app"
ports:
- "8080:8080"
links:
- redis
image: node
command: ['yarn', 'start']
redis:
image: redis
expose:
- "6379"
对于开发,此compose文件公开8080
,以便我可以从浏览器访问正在运行的代码。
但是在jenkins中,我无法公开该端口,因为同时运行的两个作业会发生冲突,试图绑定到jenkins上的同一个端口。
有没有办法阻止docker-compose绑定服务端口?就像--service-ports
旗的倒数一样?
上下文:
在jenkins中,我使用docker-compose run frontend yarn test
运行测试,这些测试不会映射端口,所以不是问题。
当我尝试针对应用程序运行端到端浏览器测试时,会出现此问题。我使用容器对应用程序的运行实例运行CodeceptJS测试。在这种情况下,我需要在运行测试之前启动前端,因为如果应用程序未启动它们将会失败。
答案 0 :(得分:1)
Q值。有没有办法阻止docker-compose绑定服务端口?
没有必要阻止你要求做的事情。 docker-compose
将在docker-compose.yml
文件指示的情况下启动内容。
我建议使用frontend
重复extends:
服务:
version: "2"
services:
frontend-base:
build:
context: .
volumes:
- "../.:/opt/app"
image: node
command: ['yarn', 'start']
frontend:
extends: frontend-base
links:
- redis
ports:
- "8080:8080"
frontend-test:
extends: frontend-base
links:
- redis
command: ['yarn', 'test']
redis:
image: redis
expose:
- "6379"
因此请将其用作:
docker-compose run frontend # in dev environment
docker-compose run frontend-test # in jenkins
请注意,extends:
中不提供version: "3"
,但会重新将其再次发送in the future。
答案 1 :(得分:0)
为防止在Docker网络外部发布端口,您只需 需要在端口段中的单个端口上写。
而不是使用它:
ports:
- 8080:8080
只需使用这个(如下):
ports:
- 8080