Docker没有创建新容器,但重新创建了一个

时间:2017-03-30 18:45:07

标签: caching docker docker-compose

所以我有以下问题。我正在使用docker-compose来构建和启动两个容器。我使用不同的docker-compose.yml文件(图像和容器名称不同)多次这样做,它工作正常,三个容器并行运行。唯一的区别是,一个容器公开特定端口,另一个容器运行连接到特定端点的应用程序。 总的来说,容器并没有那么不同,但它们是。

但是现在我创建了三个额外的compose配置,并尝试将它们并行运行,就像我已经和其他三个配置一样。现在的问题是,使用docker-compose,正在构建并启动一个容器。但第二个将停止创建的容器并重新创建它。 我尝试docker-compose build --no-cache之后docker-compose up -d,但我仍然遇到了同样的问题。虽然图像不同(ID)。在此之前,我尝试使用docker-compose up -d --build作为第一个和第二个(新)容器,它将像上面提到的那样重新创建。但是看一下图片,他们会得到相同的ID(但名字不同)。

所以我认为docker有缓存问题。这就是为什么我最终删除了所有容器和图像,并从头开始使用上面提到的选项--no-cache。虽然没用。

以下是两个有效的docker-compose.yml:

version: '2'
services:
    ruby:
        security_opt:
            - seccomp:unconfined
        build:
            context: .
            dockerfile: Dockerfile_ruby
            args:
                - http_proxy=http://someIP:3128
                - https_proxy=http://someIP:3128
        image: ruby_foo_ge01
        container_name: ruby_container_ge01
        volumes:
            - /home/foo/log/GE01/:/usr/src/app/log/
    ssl:
        security_opt:
            - seccomp:unconfined
        build:
            context: .
            dockerfile: Dockerfile_ssl
            args:
                - http_proxy=http://someIP:3128
                - https_proxy=http://someIP:3128
        image: ssl_ge01
        container_name: ssl_container_ge01
        volumes:
            - /home/foo/log/GE01/nginx/:/var/log/nginx/
        ports:
            - "3003:443"
        links:
            - ruby

和另一个:

version: '2'
services:
    ruby:
        security_opt:
            - seccomp:unconfined
        build:
            context: .
            dockerfile: Dockerfile_ruby
            args:
                - http_proxy=http://someIP:3128
                - https_proxy=http://someIP:3128
        image: ruby_foo
        container_name: ruby_container
        volumes:
            - /home/foo/log/:/usr/src/app/log/
    ssl:
        security_opt:
            - seccomp:unconfined
        build:
            context: .
            dockerfile: Dockerfile_ssl
            args:
                - http_proxy=http://someIP:3128
                - https_proxy=http://someIP:3128
        image: ssl_gt01
        container_name: ssl_container
        volumes:
            - /home/foo/log/nginx/:/var/log/nginx/
        ports:
            - "3001:443"
        links:
            - ruby

运行这两个与docker-compose up -d --build完全相似的问题是没有问题的。

以下是容器失败的两个.yml文件:

version: '2'
services:
    ruby:
        security_opt:
            - seccomp:unconfined
        build:
            context: .
            dockerfile: Dockerfile_ruby
            args:
                - http_proxy=http://someIP:3128
                - https_proxy=http://someIP:3128
        image: ruby_foo_websock_gt01
        container_name: ruby_containerWSgt01
        volumes:
            - /home/foo/websockGT01/log/:/usr/src/app/log/
    ssl:
        security_opt:
            - seccomp:unconfined
        build:
            context: .
            dockerfile: Dockerfile_ssl
            args:
                - http_proxy=http://someIP:3128
                - https_proxy=http://someIP:3128
        image: ssl_websock_gt01
        container_name: ssl_containerWSgt01
        volumes:
            - /home/foo/websockGT01/log/nginx/:/var/log/nginx/
        ports:
            - "3010:443"
        links:
            - ruby

第二个:

version: '2'
services:
    ruby:
        security_opt:
            - seccomp:unconfined
        build:
            context: .
            dockerfile: Dockerfile_ruby
            args:
                - http_proxy=http://someIP:3128
                - https_proxy=http://someIP:3128
        image: ruby_foo_websock_ge01
        container_name: ruby_containerWSge01
        volumes:
            - /home/foo/websockGE01/log/:/usr/src/app/log/
    ssl:
        security_opt:
            - seccomp:unconfined
        build:
            context: .
            dockerfile: Dockerfile_ssl
            args:
                - http_proxy=http://someIP:3128
                - https_proxy=http://someIP:3128
        image: ssl_websock_ge01
        container_name: ssl_containerWSge01
        volumes:
            - /home/foo/websockGE01/log/nginx/:/var/log/nginx/
        ports:
            - "3030:443"
        links:
            - ruby

正如您所看到的,工作.yml文件和失败的文件没有太大区别。 (或者我错过了什么?)图像和容器名称的更改与暴露的端口和卷路径一样。 所有文件都有自己的工作目录,每个实例也保存应用程序代码。所有使用过的Dockerfiles在每个工作目录中都是相同的。

TL; DR :为什么我的docker-compose没有启动新容器,但停止正在运行的容器并重新创建一个?是否有最大量的运行容器?我的.yml文件中有错误吗?正如开头所提到的--no-cache没有帮助。

亲切的问候并抱歉那段文字

1 个答案:

答案 0 :(得分:8)

简短(ish)回答

在您运行docker-compose up时,您似乎在某些时候使用相同的项目名称;由于您在ruby文件之间使用相同的服务名称(即ssldocker-compose.yml),因此Docker Compose将不同的配置视为同一服务的修改,而不是将它们视为单独的服务完全。

我的猜测是某些docker-compose.yml文件的父目录是相同的,所以如果你想同时运行这些容器,你有几个选择:

  • 更改父目录的名称,使它们完全不同
  • docker-compose up的每次调用中指定不同的项目名称,例如docker-compose -p project1 up -ddocker-compose -p project2 up -d
  • 更改服务名称,使其在不同的docker-compose.yml文件
  • 中的名称不尽相同

更长的答案

从快速测试看,Docker Compose似乎使用项目名称和服务名称来标识特定服务。在运行Docker Compose命令时,可以使用-p标志设置项目名称,否则它将使用COMPOSE_PROJECT_NAME环境变量的值(如果已设置),如果这两者都未指定,则默认为docker-compose.yml文件的父目录的名称(请参阅https://docs.docker.com/compose/reference/overview)。

所以,给定一个目录结构,如:

.
├── a
│   └── z
│       └── docker-compose.yml
├── b
│   └── z
│       └── docker-compose.yml
└── c
    └── y
        └── docker-compose.yml

docker-compose up -d目录(或使用a/z)运行docker-compose -f a/z/docker-compose.yml up -d将在项目ruby中启动sslz个服务,使用docker-compose.yml中指定的容器名称。

如果您从docker-compose up -d目录运行b/z,Docker Compose会看到您尝试再次启动项目{{1}中的rubyssl服务},但这次有一些差异,例如到名称和端口。它会将此视为已修改原始z,并使用新配置重新启动容器。如果您现在从docker-compose.yml目录运行docker-compose up -d,那么您将获得两个与项目{中运行的前两个c/yruby服务并行运行的新容器{1}}。

因此,您需要确保项目和服务名称的组合在您要运行的不同容器集中有所不同,方法是更改​​服务名称或每次都以不同方式设置项目。