docker - 从volumes_from中的另一个docker-compose文件引用服务

标签 docker docker-compose

由于我们的docker-compose配置非常庞大,我们希望将其分成多个文件。
每个文件都定义了我们应用程序的一部分(数据库,后端,工作器等),应该可以随意停止和启动(异常(exception):数据库需要首先运行-其他容器链接到它们并依赖它们)。
但是,我们还有一个媒体服务,该服务创建并持久存储存储数据库所需的Docker卷,...
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
docker-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一起使用以执行任何操作(启动,执行,...)时,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文件。

最佳答案

最后,这就是我的解决方法(基本上,我屈从于复杂的文件管理,因为docker-compose不支持任何其他对我有帮助的东西):

1)将服务分成逻辑部分,例如docker-compose.database.yml
2)将媒体服务放入另一个文件:docker-compose.media.yml
3)创建基本用扩展版本替换docker-compose命令的脚本,该扩展版本也加载docker-compose.media.yml

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

下面是我们用于运行和停止的示例:

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}

这是我们的媒体文件:

docker-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服务器配置的示例:

docker-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

哪个将被这样的文件覆盖:

docker-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}

关于docker - 从volumes_from中的另一个docker-compose文件引用服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47093932/

相关文章:

oracle - 是否有 Oracle XE 数据库的官方 Docker 镜像?

laravel - 如何使用 jwilder/whoami 在 Docker 中显示 laravel 主页

docker - 当上游节点不可用时,Nginx 容器退出并显示代码 1

php - 警报 : [pool www] user has not been defined when using thecodingmachine/php:7. 1-v3-fpm-node10

mysql - 尝试连接本地 mysql 数据库时,docker 容器上的 Django 出现错误

docker容器主机名顺序号

docker - Docker-尝试连接到数据库时出现php_network_getaddresses错误

c# - 不再在 docker 中使用 dotnet watch 的理由是什么

asp.net - 无法从 docker 支持的 asp.net core 项目连接到 sql server

linux - 无法编辑 systemd 服务文件