泊坞窗撰写孤立图像

时间:2018-06-20 12:10:17

标签: docker docker-compose

当您有2个独立项目并且希望它们同时工作,或者至少已经构建了docker-compose up -d标志且没有--remove-orphans的情况下运行它们时,如何处理孤立图像?项目。

docker撰写文件1:

version: '2'
services:
  applications:
    image: tianon/true
    volumes:
      - ../../:/var/www/vhosts/project1
  nginx:
    build: ./images/nginx
    image: project1/nginx:latest
    ports:
      - "80:80"
    volumes_from:
      -  applications
    networks:
      appnet:
        aliases:
          - project1.app
          - admin.project1.app
  php:
    image: project1/php:latest
    ports:
      - "7778:7778"
    build: 
      context: ./images/php
      dockerfile: Dockerfile
    volumes_from:
      -  applications
    networks:
      -  appnet
  mysql:
    image: project1/mysql:latest
    build: ./images/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      -  mysqldata:/var/lib/mysql
    networks:
      -  appnet
    ports:
      - "33066:3306"
 workspace:
    image: project1/workspace:latest
    build:
      context: ./images/workspace
    volumes_from:
      - applications
    working_dir: /var/www/vhosts/project1
    networks:
      -  appnet
networks:
  appnet:
    driver: "bridge"
volumes:
   mysqldata:
    driver: "local"

第二个docker compose文件:

version: '2'
services:
  project2_applications:
    image: tianon/true
    volumes:
      - ../../:/var/www/vhosts/project2
  project2_nginx:
    build: ./images/nginx
    image: project2/nginx:latest
    ports:
      - "8080:80"
    volumes_from:
      -  project2_applications
    networks:
      project2_appnet:
        aliases:
          - project2.app
          - admin.project2.app
  project2_php:
    image: project2/php:latest
    ports:
      - "7777:7777"
    build: 
      context: ./images/php
      dockerfile: Dockerfile
    volumes_from:
      -  project2_applications
    networks:
      -  project2_appnet
  project2_mysql:
    image: project2/mysql:latest
    build: ./images/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      -  project2_mysqldata:/var/lib/mysql
    networks:
      -  project2_appnet
    ports:
      - "33067:3306"
  project2_workspace:
    image: project2/workspace:latest
    build:
      context: ./images/workspace
    volumes_from:
      - project2_applications
    working_dir: /var/www/vhosts/videosite
    networks:
      -  project2_appnet
networks:
  project2_appnet:
    driver: "bridge"
volumes:
   project2_mysqldata:
    driver: "local"

现在,当我已经构建了project1并尝试为第二个项目运行docker-compose up -d时,我会看到警告警告:此项目已找到孤立的容器(docker_workspace_1,docker_nginx_1,docker_php_1,docker_mysql_1,docker_memcached_1)。如果您在撰写文件中删除或重命名了此服务,则可以使用--remove-orphans标志运行此命令以对其进行清理。

我猜想这是因为project1的容器名称应该更具体,并且我需要像为project2一样添加一些前缀,但是许多其他开发人员正在使用project1,因此我不想更改它。有什么办法可以关闭孤立检查吗?

第二件事:只是警告消息,但由于某种原因,它在显示compose后失败,并出现错误 ERROR:启动项目时遇到错误。。为了使其正常工作,我需要运行docker-compose up -d --remove-orphans

5 个答案:

答案 0 :(得分:5)

要基于其他答案,我用docker compose项目创建了一个.env文件。我有许多项目都使用docker目录,但它们是不同的项目。

使用docker-compose -p容易出错,因此在与.env相同的目录中创建docker-compose.yml文件:

-rw-rw-r--  1 auser auser 1692 Aug 22 20:34 docker-compose.yml
-rw-rw-r--  1 auser auser   31 Aug 22 20:44 .env

减轻了记住-p的必要开销。

.env文件中,我现在可以设置COMPOSE_PROJECT_NAME变量:

COMPOSE_PROJECT_NAME=myproject

正在运行:

docker-compose up -d

在不使用COMPOSE_PROJECT_NAME的情况下替换了-p

参考: https://docs.docker.com/compose/env-file/

答案 1 :(得分:3)

docker-compose up --remove-orphan

您可以运行此命令来清理孤立容器。如警告中所述

答案 2 :(得分:2)

如果孤立容器是预期的并且不打算移除,您可以将 <VirtualHost *:80> ServerName localhost DocumentRoot C:/MAMP/htdocs </VirtualHost> <VirtualHost *:80> ServerName simplesamlphp DocumentRoot C:/MAMP/htdocs/pro-dashboard Alias /simplesaml C:/MAMP/simplesamlphp/www <Directory C:/MAMP/htdocs/pro-dashboard> Order allow,deny Allow from all AllowOverride All </Directory> </VirtualHost> 变量设置为 true。

简明但马上工作的源代码是 here

一种选择是将其作为一行放入 COMPOSE_IGNORE_ORPHANS 旁边的 .env 文件中,如下所示:

docker-compose.yml

另一个选项是传递或将其设置为环境变量。

sh:

COMPOSE_IGNORE_ORPHANS=True

COMPOSE_IGNORE_ORPHANS=True docker-compose up -d 

命令:

export COMPOSE_IGNORE_ORPHANS=True
docker-compose up -d 

powershell:

SET COMPOSE_IGNORE_ORPHANS=True&& docker-compose up -d

答案 3 :(得分:1)

Compose在内部使用 项目名称 (默认为项目目录的基本名称,但可以显式指定),以将项目彼此隔离。项目名称用于为项目的所有容器和其他资源创建唯一的标识符。例如,如果您的项目名称为myapp并且包括两个服务dbweb,则Compose分别启动名为myapp_db_1myapp_web_1的容器。

您收到"Found orphan containers"警告,因为docker-compose检测到一些容器属于另一个项目,具有相同的名称

要防止不同项目相互干扰(并消除警告),可以使用-p command line optionCOMPOSE_PROJECT_NAME environment variable设置自定义项目名称。

答案 4 :(得分:0)

docker-compose将目录名称作为默认项目名称。

您可以使用-p--project-name设置不同的项目名称。 https://docs.docker.com/compose/reference/overview/#use--p-to-specify-a-project-name

我遇到了类似的问题,因为我的项目都具有docker/docker-compose.yml结构。