Java Docker compose-为运行spring boot独立应用程序的Docker容器提供基于XML的配置

Java Docker compose-为运行spring boot独立应用程序的Docker容器提供基于XML的配置,java,spring-boot,docker,docker-compose,Java,Spring Boot,Docker,Docker Compose,我想知道如何配置docker设置(docker compose),以便提供Spring引导应用程序使用的配置文件 配置文件名为services.xml,它位于应用程序的/lib/conf目录中。该文件是使用默认配置部署的,但是我希望该文件位于主机中,以便在需要更改配置时,我应该在主机中进行编辑,容器将读取更新的文件 docker-compose.yml version: '3.1' services: my-app: image: my-app container_nam

我想知道如何配置docker设置(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

我希望这会创建目录,将容器中的default services.xml(以及/opt/lib/my app/lib/conf中的所有其他文件)复制到这个目录中,以便我可以编辑它

实际结果 运行docker compose后,它会在my app目录中创建一个空目录。“我的应用”无法读取services.xml文件,应用程序无法启动(因为它取决于此文件)

我希望这会创建目录,将容器中的default services.xml(以及/opt/lib/my app/lib/conf中的所有其他文件)复制到这个目录中,以便我可以编辑它

从您上面所说的,如果您的目标是让容器中的内容弹出到主机并让您有机会修改它们,那么我建议您使用。但是,主机中的文件夹将由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",
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
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"
启动服务:

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",
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
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"
检查主机中命名卷的位置:

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",
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
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"
检查容器中原始
/etc/profile
的内容:

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",
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
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"
从主机修改脚本:

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",
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
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"
在主机上进行更改后,再次检查容器中的
/etc/profile

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",
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
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”。

您尝试过使用文件的绝对路径吗?还没有。它与将目录映射到主机和容器有什么不同?@Jocke,我得到了一个错误:
mounting\\\“/home/ubuntu/my-app/conf/services.xml\\\”到rootfs\\\”/var/lib/docker/overlay2/87ecda1732ce960a75263ca499b880d29550a70f969f06ba14ce79d1c5e06485/merged\\”\\\“/var/lib/docker/overlay2/87ecda1732ce960a75263ca499b880d29550a70f969f06ba14ce79d1c5e06485/merged/opt/lib/my-app/lib/conf/services.xml\\\”导致\\\\\“不是目录\\\\”:未知:您是否尝试将目录装载到文件上(反之亦然)?检查指定的主机路径是否存在,是否为预期类型根据,不可能在docker中装载单个文件。似乎,您更希望使用
配置服务器,而不是尝试从容器中映射配置。如果确实需要这样做,这将很有帮助。我不明白,这是无论如何,这是正确的方法。这个解决方案是有效的。谢谢你的详细回答。