gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:10:13 27 4
gpt4 key购买 nike

由于我们的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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com