【问题标题】:Docker-compose - Providing XML based configuration to docker container running spring boot standalone applicationDocker-compose - 为运行 Spring Boot 独立应用程序的 Docker 容器提供基于 XML 的配置
【发布时间】:2019-12-12 10:37:16
【问题描述】:

我想知道如何配置 docker setup (docker-compose) 以提供我的 Spring 启动应用程序使用的配置文件。

配置文件名为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 文件并且应用程序无法启动(因为它取决于此文件)。

【问题讨论】:

  • 您是否尝试过使用文件的绝对路径?
  • 还没有。与将目录映射到主机和容器有什么不同?
  • @Jocke,我收到错误:mounting \\\"/home/ubuntu/my-app/conf/services.xml\\\" to rootfs \\\"/var/lib/docker/overlay2/87ecda1732ce960a75263ca499b880d29550a70f969f06ba14ce79d1c5e06485/merged\\\" at \\\"/var/lib/docker/overlay2/87ecda1732ce960a75263ca499b880d29550a70f969f06ba14ce79d1c5e06485/merged/opt/lib/my-app/lib/conf/services.xml\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
  • 根据stackoverflow.com/questions/52711305/…,无法在docker中挂载单个文件。
  • 看来,您宁愿使用configuration-server,也不愿尝试将配置映射出容器。如果你真的需要这样做,这个stackoverflow.com/questions/30652299/… 会很有帮助。我看不出来,反正这是正确的方法。

标签: java spring-boot docker docker-compose


【解决方案1】:

我希望这应该创建目录,将容器中的默认 services.xml(以及 /opt/lib/my-app/lib/conf 中的所有其他文件)复制到该目录中,以供我编辑.

从你上面说的,如果你的目标是让容器中的内容弹出到主机并让你有机会修改它们,那么我建议你使用named volumes。但是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" 已经在容器中看到了。

【讨论】:

  • 此解决方案有效。感谢您的详细回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 2021-10-12
  • 2017-05-25
  • 2019-05-31
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
相关资源
最近更新 更多