Docker不是创建新容器而是重新创建运行容器

kin*_*ite 6 caching docker docker-compose

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

但是现在我创建了三个额外的组合配置并尝试将它们并行运行,就像我已经和其他三个一样.现在的问题是,使用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
Run Code Online (Sandbox Code Playgroud)

另一个:

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
Run Code Online (Sandbox Code Playgroud)

运行这两个和其他非常相似的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
Run Code Online (Sandbox Code Playgroud)

第二个:

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
Run Code Online (Sandbox Code Playgroud)

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

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

亲切的问候和抱歉的那面墙

abu*_*ord 8

简短(ish)回答

看起来好像你在运行时有时会使用相同的项目名称docker-compose up; 由于您在文件之间使用相同的服务名称(即rubyssl)docker-compose.yml,因此Docker Compose将不同的配置视为同一服务的修改,而不是将它们视为完全独立的服务.

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

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

更长的答案

从快速测试看,Docker Compose似乎使用项目名称和服务名称来标识特定服务.-p在运行Docker Compose命令时,可以使用标志设置项目名称,否则它将使用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
Run Code Online (Sandbox Code Playgroud)

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

如果您然后运行docker-compose up -db/z目录,多克尔撰写会看到你尝试再次弹出rubyssl服务项目z,但这次有一些不同,如以名和端口.它会将此视为已修改原始文件docker-compose.yml,并使用新配置重新启动容器.如果您现在docker-compose up -d要从c/y目录运行,那么您将获得两个与前两个并行运行的新容器,ruby以及ssl在项目中运行的服务y.

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