tomcat docker 安装的卷变空
tomcat docker mounted volume becomes empty
我有一个 docker-compose.yml
看起来像这样:
version: '3'
services:
tomcat:
container_name: tomcat8
restart: always
image: tomcat:8-jdk8
ports:
- 80:8080
volumes:
- /var/docker/myservice/tomcat/data/webapps:/usr/local/tomcat/webapps:Z
我想把容器里面的tomcat/webapps
文件夹挂载到宿主机上,这样就不用进入docker容器修改应用了
但是,当此容器启动时,/usr/local/tomcat/webapps
文件夹变为空。 ROOT/
、docs/
、examples/
、host-manager/
、manager/
本该在tomcat启动时创建的文件夹都没有了
我原本以为这是因为容器没有权限写入主机上的卷。但是我已经按照 this post's 的说明在卷的末尾添加了一个 Z
。
我的配置有什么问题?为什么容器内的 /usr/local/tomcat/webapps
文件夹变空了?
有什么办法可以让容器中/usr/local/tomcat/webapps
中的数据覆盖宿主机中/var/docker/myservice/tomcat/data/webapps
中的数据吗?
对于tomcat:8-jdk8
,我们可以看到下一个:
$ docker inspect tomcat:8-jdk8 | grep Entrypoint
"Entrypoint": null,
"Entrypoint": null,
另见 tomcat:8-jdk8
Dockerfile:
CMD ["catalina.sh", "run"]
总而言之,容器的唯一启动脚本是 catalina.sh
,因此如果我们像下一步一样覆盖它:
$ docker run -it --rm tomcat:8-jdk8 ls /usr/local/tomcat/webapps
ROOT docs examples host-manager manager
我们可以看到,即使我们没有像 catalina.sh
那样启动任何启动脚本,我们仍然可以在 /usr/local/tomcat/webapps
.
中看到 ROOT, docks, etc
这意味着,图像 tomcat:8-jdk8
中的上述文件夹不是由 catalina.sh
动态生成的。因此,当您使用 - /var/docker/myservice/tomcat/data/webapps:/usr/local/tomcat/webapps
作为绑定装载卷时,主机上的空文件夹将覆盖容器文件夹 /usr/local/tomcat/webapps
中的所有内容,因此您将在容器中看到空文件夹。
更新:
Is there any way to let the data in /usr/local/tomcat/webapps in the container to overwrite the data in /var/docker/myservice/tomcat/data/webapps in the host machine?
最近的解决方案是使用命名卷:
docker-compose.yaml:
version: '3'
services:
tomcat:
container_name: tomcat8
restart: always
image: tomcat:8-jdk8
ports:
- 80:8080
volumes:
- my-data:/usr/local/tomcat/webapps:Z
volumes:
my-data:
然后看下一个命令列表:(注意:99_my-data,这里99是你存放docker-compose.yaml的文件夹)
shubuntu1@shubuntu1:~/99$ docker-compose up -d
Creating tomcat8 ... done
shubuntu1@shubuntu1:~/99$ docker volume inspect 99_my-data
[
{
"CreatedAt": "2019-07-15T15:09:32+08:00",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "99",
"com.docker.compose.version": "1.24.0",
"com.docker.compose.volume": "my-data"
},
"Mountpoint": "/var/lib/docker/volumes/99_my-data/_data",
"Name": "99_my-data",
"Options": null,
"Scope": "local"
}
]
shubuntu1@shubuntu1:~/99$ sudo -s -H
root@shubuntu1:/home/shubuntu1/99# cd /var/lib/docker/volumes/99_my-data/_data
root@shubuntu1:/var/lib/docker/volumes/99_my-data/_data# ls -alh
total 28K
drwxr-xr-x 7 root root 4.0K 7月 15 15:09 .
drwxr-xr-x 3 root root 4.0K 7月 15 15:09 ..
drwxr-xr-x 14 root root 4.0K 7月 15 15:09 docs
drwxr-xr-x 6 root root 4.0K 7月 15 15:09 examples
drwxr-xr-x 5 root root 4.0K 7月 15 15:09 host-manager
drwxr-xr-x 5 root root 4.0K 7月 15 15:09 manager
drwxr-xr-x 3 root root 4.0K 7月 15 15:09 ROOT
这是将内容弹出到主机的最近方法。
另一个解决方案:将 /var/docker/myservice/tomcat/data/webapps
挂载到容器文件夹而不是 /usr/local/tomcat/webapps
,例如/tmp/abc
,然后自定义您的CMD,将/usr/local/tomcat/webapps
中的东西复制到/tmp/abc
,然后在您的主机/var/docker/myservice/tomcat/data/webapps
中也可以看到它们...
我有一个 docker-compose.yml
看起来像这样:
version: '3'
services:
tomcat:
container_name: tomcat8
restart: always
image: tomcat:8-jdk8
ports:
- 80:8080
volumes:
- /var/docker/myservice/tomcat/data/webapps:/usr/local/tomcat/webapps:Z
我想把容器里面的tomcat/webapps
文件夹挂载到宿主机上,这样就不用进入docker容器修改应用了
但是,当此容器启动时,/usr/local/tomcat/webapps
文件夹变为空。 ROOT/
、docs/
、examples/
、host-manager/
、manager/
本该在tomcat启动时创建的文件夹都没有了
我原本以为这是因为容器没有权限写入主机上的卷。但是我已经按照 this post's 的说明在卷的末尾添加了一个 Z
。
我的配置有什么问题?为什么容器内的 /usr/local/tomcat/webapps
文件夹变空了?
有什么办法可以让容器中/usr/local/tomcat/webapps
中的数据覆盖宿主机中/var/docker/myservice/tomcat/data/webapps
中的数据吗?
对于tomcat:8-jdk8
,我们可以看到下一个:
$ docker inspect tomcat:8-jdk8 | grep Entrypoint
"Entrypoint": null,
"Entrypoint": null,
另见 tomcat:8-jdk8
Dockerfile:
CMD ["catalina.sh", "run"]
总而言之,容器的唯一启动脚本是 catalina.sh
,因此如果我们像下一步一样覆盖它:
$ docker run -it --rm tomcat:8-jdk8 ls /usr/local/tomcat/webapps
ROOT docs examples host-manager manager
我们可以看到,即使我们没有像 catalina.sh
那样启动任何启动脚本,我们仍然可以在 /usr/local/tomcat/webapps
.
ROOT, docks, etc
这意味着,图像 tomcat:8-jdk8
中的上述文件夹不是由 catalina.sh
动态生成的。因此,当您使用 - /var/docker/myservice/tomcat/data/webapps:/usr/local/tomcat/webapps
作为绑定装载卷时,主机上的空文件夹将覆盖容器文件夹 /usr/local/tomcat/webapps
中的所有内容,因此您将在容器中看到空文件夹。
更新:
Is there any way to let the data in /usr/local/tomcat/webapps in the container to overwrite the data in /var/docker/myservice/tomcat/data/webapps in the host machine?
最近的解决方案是使用命名卷:
docker-compose.yaml:
version: '3'
services:
tomcat:
container_name: tomcat8
restart: always
image: tomcat:8-jdk8
ports:
- 80:8080
volumes:
- my-data:/usr/local/tomcat/webapps:Z
volumes:
my-data:
然后看下一个命令列表:(注意:99_my-data,这里99是你存放docker-compose.yaml的文件夹)
shubuntu1@shubuntu1:~/99$ docker-compose up -d
Creating tomcat8 ... done
shubuntu1@shubuntu1:~/99$ docker volume inspect 99_my-data
[
{
"CreatedAt": "2019-07-15T15:09:32+08:00",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "99",
"com.docker.compose.version": "1.24.0",
"com.docker.compose.volume": "my-data"
},
"Mountpoint": "/var/lib/docker/volumes/99_my-data/_data",
"Name": "99_my-data",
"Options": null,
"Scope": "local"
}
]
shubuntu1@shubuntu1:~/99$ sudo -s -H
root@shubuntu1:/home/shubuntu1/99# cd /var/lib/docker/volumes/99_my-data/_data
root@shubuntu1:/var/lib/docker/volumes/99_my-data/_data# ls -alh
total 28K
drwxr-xr-x 7 root root 4.0K 7月 15 15:09 .
drwxr-xr-x 3 root root 4.0K 7月 15 15:09 ..
drwxr-xr-x 14 root root 4.0K 7月 15 15:09 docs
drwxr-xr-x 6 root root 4.0K 7月 15 15:09 examples
drwxr-xr-x 5 root root 4.0K 7月 15 15:09 host-manager
drwxr-xr-x 5 root root 4.0K 7月 15 15:09 manager
drwxr-xr-x 3 root root 4.0K 7月 15 15:09 ROOT
这是将内容弹出到主机的最近方法。
另一个解决方案:将 /var/docker/myservice/tomcat/data/webapps
挂载到容器文件夹而不是 /usr/local/tomcat/webapps
,例如/tmp/abc
,然后自定义您的CMD,将/usr/local/tomcat/webapps
中的东西复制到/tmp/abc
,然后在您的主机/var/docker/myservice/tomcat/data/webapps
中也可以看到它们...