java - Docker-compose - 为运行 Spring Boot 独立应用程序的 Docker 容器提供基于 XML 的配置
问题描述
我想知道如何配置 docker setup (docker-compose) 以提供我的 Spring boot 应用程序使用的配置文件。
调用services.xml
驻留在应用程序/lib/conf
目录中的配置文件。该文件是使用默认配置部署的,但是我希望该文件在主机中,以便每当我需要更改配置时,我应该在主机中进行编辑,并且容器将读取更新的文件。
docker-compose.yml
version: '3.1'
services:
my-app:
image: my-app
container_name: my-app
# restart: always
ports:
- 8443:8443
volumes:
- ./my-app/conf:/opt/lib/my-app/lib/conf:rw
运行后的预期结果: docker-compose up
我希望这应该创建目录,将容器中的默认 services.xml(以及 /opt/lib/my-app/lib/conf 中的所有其他文件)复制到该目录中,以供我编辑。
实际结果 运行 docker-compose 后,它会在 my-app 目录中创建一个空目录。my-app 无法读取 services.xml 文件并且应用程序无法启动(因为它取决于此文件)。
解决方案
我希望这应该创建目录,将容器中的默认 services.xml(以及 /opt/lib/my-app/lib/conf 中的所有其他文件)复制到该目录中,以供我编辑。
根据您上面所说,如果您的目标是让容器中的内容弹出到主机并让您有机会修改它们,那么我建议您使用命名卷。但是,host 中的文件夹将由 docker 自己管理,因此您需要找到它们所在的位置。
供您参考的最小示例:
docker-compose.yaml(在我的示例中,它位于文件夹中77
):
version: '3'
services:
frontend:
image: alpine
command: "tail -f /dev/null"
volumes:
- my_data:/etc
volumes:
my_data:
启动服务:
shubuntu1@shubuntu1:~/77$ docker-compose up -d
Creating network "77_default" with the default driver
Creating volume "77_my_data" with default driver
Creating 77_frontend_1 ... done
检查命名卷在主机中的位置:
shubuntu1@shubuntu1:~/77$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6635aba545c9 alpine "tail -f /dev/null" 14 minutes ago Up 14 minutes 77_frontend_1
shubuntu1@shubuntu1:~/77$ docker inspect 77_frontend_1 | grep Source
"Source": "/var/lib/docker/volumes/77_my_data/_data",
检查容器中原件的内容/etc/profile
:
shubuntu1@shubuntu1:~/77$ docker exec 77_frontend_1 cat /etc/profile
export CHARSET=UTF-8
export LANG=C.UTF-8
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export PAGER=less
export PS1='\h:\w\$ '
umask 022
for script in /etc/profile.d/*.sh ; do
if [ -r $script ] ; then
. $script
fi
done
从主机修改脚本:
shubuntu1@shubuntu1:~/77$ sudo -s -H
root@shubuntu1:/home/shubuntu1/77# cd /var/lib/docker/volumes/77_my_data/_data
root@shubuntu1:/var/lib/docker/volumes/77_my_data/_data# echo 'echo "hello"' >> profile
/etc/profile
在我们对主机进行更改后再次检查容器:
shubuntu1@shubuntu1:~/77$ docker exec 77_frontend_1 cat /etc/profile
export CHARSET=UTF-8
export LANG=C.UTF-8
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export PAGER=less
export PS1='\h:\w\$ '
umask 022
for script in /etc/profile.d/*.sh ; do
if [ -r $script ] ; then
. $script
fi
done
echo "hello"
我们可以看到echo "hello"
我们在主机上添加的内容已经在容器中看到了。
推荐阅读
- c++ - How to safe cast int reference to long reference?
- jquery - 使用 JQuery 删除元素
- flutter - 在颤动中从 Firebase 实时数据库中检索数据时,是否有任何方法可以显示加载小部件
- python - 重命名设置为索引的列
- jupyter - 虚拟环境中的 Jupyter 目录
- gap-system - 有没有办法“捕捉” GAP 中的错误?
- mysql - 无法使用 quit 退出 MySQL):
- python - 根据另一个 DF 排列水平 DF 条目
- python - PyAutoGUI 在定位图像时会忽略颜色
- mysql - 创建用户并授予对 mySQL 的所有权限