【问题标题】:Copy a folder into a mounted volume within a Docker Container将文件夹复制到 Docker 容器中的已安装卷中
【发布时间】:2017-09-10 01:33:12
【问题描述】:

我有一个用于在/home/ics199/vendor/ 处生成vendor/ 文件夹的映像的Dockerfile。我想将此文件夹复制到/var/www/html。问题是我还使用/var/www/html 作为与主机一起安装的卷。如果我将vendor/ 文件夹复制到/var/www/html,则在安装卷时它会被隐藏并且无法使用。所以,它需要在挂载后被复制。我希望将其复制到容器中以保留文件权限(而不是容器-> 主机-> 容器),尽管我知道作为副作用,它会出现在主机的挂载卷中。最好的方法是什么(最好是自动)?

【问题讨论】:

  • 我相信您需要在容器运行时进行复制(即通过CMDENTRYPOINT)。
  • 您是否希望容器内的文件夹结构为/var/www/html/vendor?如果是这样,您可以在docker run 命令中使用两次-v,首先是-v /foo/bar:/var/www/html,然后是-v /home/ics199/vendor:/var/www/html/vendor
  • 我认为这行不通,因为/home/ics199/vendor 不在主机上,而是在容器中。现在,我正在手动操作docker exec -it <container id> bash,然后手动操作cp -R /home/ics199/vendor/ /var/www/html

标签: docker containers volumes


【解决方案1】:

我会按照 Oliver 的建议在入口点执行此操作,但您可以使用指向容器内文件夹的符号链接而不是副本:

示例 entrypoint.sh:

#!/bin/sh

ln -sf /home/ics199/vendor /var/www/html/vendor
if [ $# == 0 ]; then
  set -- /bin/sh
fi
exec "$@"

Dockerfile 将包括:

COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT /entrypoint.sh

【讨论】:

  • 如果基础镜像已经有一个入口点,这会导致问题吗?根据Dockerfile reference,只有最后一个被执行。
  • 你需要用你的 ln 命令更新现有的端点,或者在你的末尾调用他们的端点。
猜你喜欢
  • 2021-05-08
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
相关资源
最近更新 更多