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