我希望将文件从主机复制到docker容器。许多解决方案都提供了命令
docker cp ...
然而,这在我的情况下不起作用。在我的情况下,初始化命令的是docker本身。初始启动会在docker中触发一个特殊脚本,该脚本将复制所有文件,并初始化docker。 (通常来自git repo,但是为了调试我希望从文件系统启用复制)。
问题是,在docker中,docker
命令不存在。所以我不能使用docker cp
。那怎么做?这样我就可以加快开发速度(而不是在测试期间推送每个次要更新,然后我可以直接测试)。
<小时/> 为了清理事物,我的泊坞窗图像具有入口点
init.sh
这个文件因此被称为每次启动,它包含(以及其他设置属性中的以下内容:
if [ ! -f /initialized ]; then
apk add --virtual .init-deps bash
if [ -z ${FILE} ]; then
echo "Building from server"
apk add --virtual .init-deps git
bash load_git.sh "${GIT_SERVER}" "${GIT_USERNAME}" "${GIT_PASSWORD}"
echo clone done
else
echo "Building from file"
bash load_filestystem.sh "${FILE}"
echo copying done
fi
if [ $? -eq 0]; then
sh copy_code.sh
if [ $? -eq 0 ]; then
echo "Build success"
touch /initialized
fi
fi
apk --purge del .init-deps
fi
load_git.sh
包含以下行:
git clone https://${USERNAME}:${PASSWORD}@${REPOSITORY} tmp
克隆git存储库并将其放入“要复制”的临时文件夹中。现在我希望load_filesystem.sh
做“相同”,除了从外部存储库,我希望它从主机系统“克隆”。
这允许测试&amp;在外部存储库不可用的情况下继续工作。
请注意,init.sh
是从容器内运行的(它是入口点)。
在人们问之前:我们选择此设置,而不是docker构建文件,因为synology NAS服务器似乎希望直接提供图像文件。为了提高部署速度,我们然后制作通用的图像,并在首次运行时加载代码(或使用标志重新启动)。
所以最后问题是:如何从git服务器复制文件(存储库),而不是从主机操作系统的文件系统复制文件?
答案 0 :(得分:1)
使用volumes。
启动容器时,您可以决定是否确实要安装某些文件,或者只需安装一个空目录。 然后在容器中你可以从那里cp *,或者直接使用目录的内容。
我不希望在prod上有不同于测试的行为,在两种环境中完全相同。
答案 1 :(得分:0)
更新:
在这种情况下你有两种选择:
1.禁用执行GIT克隆的代码( load_git.sh 等),并删除 load_filesystem.sh 。现在,编写一个脚本来执行docker build
,并在此脚本中将文件(您的最新文件)复制到您希望构建文件从中获取文件的文件夹。
2.在您当地创建一个git仓库,并将您的最新信息推送到本地仓库。更新你的git代码,指出这个本地仓库进行测试。这样你就可以避免推进主回购。
我会使用第一种方法,因为它快速而简单。