在volumes_from

时间:2017-11-03 10:47:37

标签: docker docker-compose

由于我们的docker-compose配置非常庞大,我们希望将它分成多个文件。 每个文件定义了我们应用程序的一部分(数据库,后端,工作者......),并且应该可以随意停止和启动(例外:数据库需要先运行 - 其他容器链接到它们并依赖它们)。

但是,我们还有一个媒体服务,它创建并保存我们存储数据库所需的docker卷,...

搬运工-compose.database.yml:

version: '2'
services:
  media:
    build: ./docker/app_data
    env_file: ./envs/.${ENVIRONMENT_NAME}
    volumes:
      - /data/db
      - /data/files
      - /data/mydb
      - /logs
    command: /bin/true
    networks:
      - my-net

  (...)

  memcached:
    extends:
      file: common-services.yml
      service: memcached
    env_file: ./envs/.${ENVIRONMENT_NAME}
    restart: on-failure
    mem_limit: 4g
    command: memcached -m 3072m -vv
    ports:
      - "11211:11211"
    networks:
      - my-net

搬运工-compose.app.yml:

version: '2'
services:
  app:
    extends:
      file: common-services.yml
      service: app
    env_file: ./envs/.${ENVIRONMENT_NAME}
    restart: on-failure
    command: "/wait-for-it.sh postgres:5432 -- /entrypoint.sh"
    external_links:
      - myproj_mongo_1:mongo
      - myproj_rabbitmq_1:rabbitmq
      - myproj_memcached_1:memcached
      - myproj_postgres_1:postgres
    volumes_from:
      - media
      - fe
    ports:
      - "8000:8000"
    networks:
      - my-net

 fe:
    extends:
      file: common-services.yml
      service: fe
    env_file: ./envs/.${ENVIRONMENT_NAME}
    command: npm run build
    networks:
      - my-net

每当我尝试使用docker-compose.app.yml配置和docker-compose做任何事情(start,exec,...)时,docker-compose都存在,并出现以下错误:

docker-compose -f docker-compose.app.yml up -d --remove-orphans
ERROR: Service "app" mounts volumes from "media", which is not the name of a service or container.

现在的问题是:如何正确地从媒体加载卷?我唯一的想法(但是想要避免,如果有更好的解决方案,因为我必须更改大量脚本)是在另一个docker-compose.yml文件中定义媒体,该文件总是与其他docker一起加载-compose.yml文件。

1 个答案:

答案 0 :(得分:0)

最后,这就是我解决它的方式(基本上,我放弃了复杂的文件管理,因为docker-compose不支持任何帮助我的东西):

1)将服务拆分为逻辑部分,例如泊坞窗,compose.database.yml 2)将媒体服务扔到另一个文件中:docker-compose.media.yml 3)创建脚本,基本上用一个也加载了docker-compose.media.yml的扩充版本替换docker-compose命令

我们还对此进行了进一步扩充,并在脚本中添加了针对特殊变体的查找(例如,清理SFTP容器以便在启动时重新创建它们,加载公钥注册表中的所有更改或正确关闭所有数据库) 我们还以相同的方式查找特定于环境的文件(例如,为特定服务器设置特殊设置):

在我们的run& amp;示例中停止:

<强> docker_run.sh

#!/bin/bash
PWD_DIR=$(pwd)
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
cd ${SCRIPT_DIR}
cd ..

SERVER_COMPONENT=$1
export ENVIRONMENT_NAME=$2

if [ ! -f docker-compose.${SERVER_COMPONENT}."${ENVIRONMENT_NAME}".yml ]; then
    ENVIRONMENT_FILE=""
else
    ENVIRONMENT_FILE="-f docker-compose.${SERVER_COMPONENT}."${ENVIRONMENT_NAME}".yml"
fi
if [ ! -f docker-compose.media."${ENVIRONMENT_NAME}".yml ]; then
    MEDIA_ENVIRONMENT_FILE=""
else
    MEDIA_ENVIRONMENT_FILE="-f docker-compose.media."${ENVIRONMENT_NAME}".yml"
fi
docker-compose -f docker-compose.media.yml ${MEDIA_ENVIRONMENT_FILE} -f docker-compose."${SERVER_COMPONENT}".yml ${ENVIRONMENT_FILE} stop
docker-compose -f docker-compose.media.yml ${MEDIA_ENVIRONMENT_FILE} -f docker-compose."${SERVER_COMPONENT}".yml ${ENVIRONMENT_FILE} up -d

cd ${PWD_DIR}

<强> docker_stop.sh

#!/bin/bash
PWD_DIR=$(pwd)
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
cd ${SCRIPT_DIR}
cd ..

SERVER_COMPONENT=$1
export ENVIRONMENT_NAME=$2
if [ ! -f docker-compose.${SERVER_COMPONENT}."${ENVIRONMENT_NAME}".yml ]; then
    ENVIRONMENT_FILE=""
else
    ENVIRONMENT_FILE="-f docker-compose.${SERVER_COMPONENT}."${ENVIRONMENT_NAME}".yml"
fi
if [ ! -f docker-compose.media."${ENVIRONMENT_NAME}".yml ]; then
    MEDIA_ENVIRONMENT_FILE=""
else
    MEDIA_ENVIRONMENT_FILE="-f docker-compose.media."${ENVIRONMENT_NAME}".yml"
fi
if [ ! -f bin/docker_stop."${SERVER_COMPONENT}".sh ]; then
    # no special docker stio handling
    docker-compose -f docker-compose.media.yml ${MEDIA_ENVIRONMENT_FILE} -f docker-compose."${SERVER_COMPONENT}".yml ${ENVIRONMENT_FILE} stop
else
    bin/docker_stop."${SERVER_COMPONENT}".sh ${SERVER_COMPONENT} ${ENVIRONMENT_NAME}
fi

cd ${PWD_DIR}

这是我们的媒体文件:

<强>搬运工-compose.media.yml

version: '2'
services:
  media:
    build: ./docker/app_data
    env_file: ./envs/.${ENVIRONMENT_NAME}
    volumes:
      - /data/db
      - /data/files
      - /data/postgresdb
      - /logs
    command: /bin/true
    networks:
      - my-net

networks:
  my-net:

以下是我的开发postgres服务器配置的示例:

<强>搬运工-compose.database.yml

version: '2'
services:
  (...)

  postgres:
    extends:
      file: common-3rdParty-services.yml
      service: postgres
    env_file: ./envs/.${ENVIRONMENT_NAME}
    restart: on-failure
    volumes_from:
      - media
    environment:
      PGDATA: /data/postgresdb

哪个覆盖了这样的文件:

<强>搬运工-compose.database.tst.yml

version: '2'
services:
  (...)

  postgres:
    ports:
      - "5432:5432"

自定义停止脚本操作:

<强> docker_stop.database.sh

#!/bin/bash
PWD_DIR=$(pwd)
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
cd ${SCRIPT_DIR}
cd ..

SERVER_COMPONENT=$1
export ENVIRONMENT_NAME=$2
if [ ! -f docker-compose.${SERVER_COMPONENT}."${ENVIRONMENT_NAME}".yml ]; then
    ENVIRONMENT_FILE=""
else
    ENVIRONMENT_FILE="-f docker-compose.${SERVER_COMPONENT}."${ENVIRONMENT_NAME}".yml"
fi
if [ ! -f docker-compose.media."${ENVIRONMENT_NAME}".yml ]; then
    MEDIA_ENVIRONMENT_FILE=""
else
    MEDIA_ENVIRONMENT_FILE="-f docker-compose.media."${ENVIRONMENT_NAME}".yml"
fi

docker-compose -f docker-compose.media.yml ${MEDIA_ENVIRONMENT_FILE} -f docker-compose.database.yml ${ENVIRONMENT_FILE} exec mongo mongod --shutdown
docker-compose -f docker-compose.media.yml ${MEDIA_ENVIRONMENT_FILE} -f docker-compose.database.yml ${ENVIRONMENT_FILE} exec rabbitmq rabbitmqctl shutdown
docker-compose -f docker-compose.media.yml ${MEDIA_ENVIRONMENT_FILE} -f docker-compose.database.yml ${ENVIRONMENT_FILE} exec -u postgres postgres pg_ctl stop
docker-compose -f docker-compose.media.yml ${MEDIA_ENVIRONMENT_FILE} -f docker-compose.database.yml ${ENVIRONMENT_FILE} stop

cd ${PWD_DIR}