【问题标题】:Docker volume creates malfunction in container behaviourDocker 卷在容器行为中造成故障
【发布时间】:2021-01-15 17:11:12
【问题描述】:

我正在尝试在 docker 容器 (confluence) 中创建目录卷。 https://hub.docker.com/r/atlassian/confluence-server/

要修复 postgres 的错误,我必须在容器中手动添加驱动程序文件。容器内的位置是:

/opt/atlassian/confluence/confluence/WEB-INF/lib

创建卷后,我想将较新的驱动程序添加到目录中。因此,在我的 docker-compose.yaml 中,我将一个卷映射到目录。

- ./data/driverfiles:/opt/atlassian/confluence/confluence/WEB-INF/lib

在调用docker-compose up 后创建了卷和目录,一切似乎都很好。

问题是,该卷仍然是空的,当启动一个交互式外壳进入容器​​时,曾经充满数千个文件的目录也是空的。从 docker-compose.yaml 中删除卷时,该目录再次充满文件。

客观地说,似乎将卷映射到这个目录以某种方式禁止容器用文件丰富它,这是怎么回事?

【问题讨论】:

    标签: docker docker-compose confluence docker-volume


    【解决方案1】:

    如果您在容器目录上挂载主机目录,则在容器启动时,这始终是一种单向操作:主机目录中的任何内容(如果有的话)将完全替换映像中可能存在的任何内容。除非映像启动代码明确为您执行此操作,否则容器中的内容永远不会被复制到主机目录中。

    如果需要修改容器中的配置文件,需要先从镜像中拷贝出来;例如

    # with the volumes: mount deleted
    docker-compose run confluence \
      sh -c 'cd /opt/atlassian/confluence/confluence/WEB-INF/lib && tar cf - .' \
    | tar xf - .
    

    该特定调用会将整个目录复制到主机,您可以在其中再次挂载它。

    请注意,如果有更新的图像会更改此 lib 目录的内容,则您在主机上的内容将始终优先;这隐藏了可能对图像进行的任何更改。

    您可能会发现构建添加所需驱动程序文件的自定义映像更可靠

    FROM ...conflunce:...
    COPY ... /opt/atlassian/confluence/confluence/WEB-INF/lib
    # Use CMD and all other options from the original image
    

    docker-compose.yml 文件中指定 build: .(而不是 image:)以使用此 Dockerfile。

    【讨论】:

      猜你喜欢
      • 2019-03-04
      • 2014-08-08
      • 2017-05-20
      • 2021-02-24
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 2018-10-16
      • 2021-04-27
      相关资源
      最近更新 更多