将文件从主机复制到docker容器,在docker内的脚本中执行

将文件从主机复制到docker容器,在docker内的脚本中执行,docker,copy,Docker,Copy,我希望将文件从主机复制到docker容器。许多解决方案发出指令 docker cp ... 然而,这在我的情况下不起作用。在我的例子中,初始化命令的是docker本身。初始启动会在docker中触发一个特殊脚本,该脚本将复制所有文件,并初始化docker。(通常来自git repo,但为了调试,我希望启用从文件系统复制) 问题是,在docker内部,docker命令不存在。所以我不能使用docker cp。那么如何做到这一点呢?这样我就可以加快开发速度(而不是在测试过程中推送每个小的更新,这样

我希望将文件从主机复制到docker容器。许多解决方案发出指令

docker cp ...
然而,这在我的情况下不起作用。在我的例子中,初始化命令的是docker本身。初始启动会在docker中触发一个特殊脚本,该脚本将复制所有文件,并初始化docker。(通常来自git repo,但为了调试,我希望启用从文件系统复制)

问题是,在docker内部,
docker
命令不存在。所以我不能使用
docker cp
。那么如何做到这一点呢?这样我就可以加快开发速度(而不是在测试过程中推送每个小的更新,这样我就可以直接测试)


为了解决问题,我的docker图像有一个入口点
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\u git.sh
包含以下行:

git clone https://${USERNAME}:${PASSWORD}@${REPOSITORY} tmp
它克隆git存储库并将其放入临时文件夹“待复制”。现在我希望使
load\u filesystem.sh
执行“相同”操作,除了从外部存储库中,我希望它从主机系统“克隆”

这允许在外部存储库不可用时继续测试和工作

注意,
init.sh
是从容器内部运行的(它是入口点)


在人们询问之前:我们选择此设置,而不是docker构建文件,因为synology NAS服务器似乎希望直接提供映像文件。为了提高部署速度,我们制作通用映像,并在第一次运行时加载代码(或使用标志重新启动)

因此,最后的问题是:如何不从git服务器而是从主机操作系统的文件系统复制文件(存储库)?

更新: 在这种情况下,您有两种选择:
1.禁用执行GIT克隆的代码(load_GIT.sh等),并删除load_filesystem.sh。现在,编写一个脚本来执行
docker build
,并在该脚本中将文件(您最新的文件)复制到您希望构建从中提取文件的文件夹中。
2.在本地创建git回购,并将最新版本推送到本地回购。更新git代码以指向本地回购进行测试。这样可以避免推送到主回购。

我会使用第一种方法,因为它快速简单。

使用

启动容器时,您可以决定是否确实要装载某些文件,或者只装载一个空目录。 然后在容器中,您可以从那里使用cp*,或者直接使用目录的内容


我不希望在prod上的行为与在测试上的行为不同,在两种环境中的行为完全相同。

对于当前设置的工作方式有点不清楚。您可以尝试添加更多信息吗?@TarunLalwani我试图澄清一些问题。现在可以理解吗?因为这只适用于(自动)测试出于调试目的,这不是我希望的方法。因为使用卷意味着它在生产系统上也可见。(目标是我可以在生产上使用与开发相同的docker映像)。这也很糟糕,因为它需要我以特定的方式设置主机-虽然我只想告诉docker来自主机的某些信息。不,如果您不在prod上装载任何内容,目录将为空。否则您将装载一些文件。它仍然是相同的映像,但配置不同,这是正常的。“问题”对于卷,我们多次使用相同的映像。但是,根据环境变量,在初始化脚本期间,docker“填充”了不同的数据。卷意味着每个docker使用相同的本地数据(如果配置为使用本地数据)不,卷意味着每个容器都将使用您在运行时提供的数据,具体取决于您在其中装载的内容。它可以是任何内容。因此,您要从主机复制的内容,您只需装载,然后复制,就像它是容器中的普通文件一样!