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

时间:2018-03-30 17:43:27

标签: docker copy

我希望将文件从主机复制到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服务器复制文件(存储库),而不是从主机操作系统的文件系统复制文件?

2 个答案:

答案 0 :(得分:1)

使用volumes

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

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

答案 1 :(得分:0)

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

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