2017-07-14 110 views
1

定义防止出版的端口我有一个定义将运行我的应用程序和服务,该应用程序依赖于运行的服务的码头工人撰写文件:在撰写文件

services: 
    frontend: 
    build: 
     context: . 
    volumes: 
     - "../.:/opt/app" 
    ports: 
     - "8080:8080" 
    links: 
     - redis 
    image: node 
    command: ['yarn', 'start'] 
    redis: 
    image: redis 
    expose: 
     - "6379" 

对于发展这个撰写文件自曝8080,以便我可以从浏览器访问正在运行的代码。

在jenkins但是我不能公开那个端口,那么两个同时运行的作业会冲突试图绑定到jenkins上的同一个端口。

有没有一种方法可以防止docker-compose绑定服务端口?像--service-ports旗的倒数?


对于背景:

在詹金斯我运行使用docker-compose run frontend yarn test,不会端口映射,所以是没有问题的测试。

当我尝试运行对应用程序的端到端浏览器测试时,会出现此问题。我使用容器对正在运行的应用程序实例运行CodeceptJS测试。在这种情况下,我需要在运行测试之前启动前端,因为如果应用程序未启动,它们将失败。

+0

如果'CodeceptJS'是一个容器,基本上你可以将它作为一个服务添加到组合文件中,然后'前端'服务包含'CodeceptJS'作为候选链接的一个,然后使用'expose'而不是'端口“将8080暴露给链接的服务。这会工作吗? –

回答

1

问:是否有办法阻止docker-compose绑定服务端口?

它是没有意义的,以防止你要求做的事情。 docker-compose将以docker-compose.yml文件指示的方式启动。

我建议使用extends:复制frontend服务:

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

+0

聪明的做法,这听起来像是最接近的解决方案,使所有这一切在一个撰写文件,而不需要维护两个单独的文件。 –