docker - tomcat docker 安装的卷变空

标签 docker tomcat docker-compose tomcat8

我有一个 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 中看到 ROOT、docks 等/tomcat/webapps.

这意味着,上面的文件夹只是在图像 tomcat:8-jdk8 中,而不是由 catalina.sh 动态生成的。因此,当您使用 -/var/docker/myservice/tomcat/data/webapps:/usr/local/tomcat/webapps 作为绑定(bind)安装卷时,主机上的空文件夹将覆盖所有内容在容器文件夹 /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 - tomcat docker 安装的卷变空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57033128/

相关文章:

docker - Docker 容器中的应用程序如何访问托管在同一 LAN 中的另一台服务器上的数据库

docker - 如何使用 dockerfile 添加用户?

scala - 将 CSV 从本地机器加载到在 Docker 上运行的 spark

MySQL连接数没有增加

java - 从eclipse在Tomcat上动态部署项目

node.js - 无法通过Docker-compose连接到MongoDB

php - PHP脚本无法从卷中看到目录

node.js - 如何拥有相同服务的不同docker容器?

java - IntelliJ tomcat 扩展类路径

nginx - Docker nginx 和 Go (Golang) 分离容器。 Nginx 配置