将文件从主机复制到 docker 容器然后提交并推送

Copy files from host to docker container then commit and push

我在 Ubuntu 中使用 docker。在开发阶段,我从主机中的 Git 克隆了所有源代码,在 WebStorm 中编辑它们,然后它们在带有 -v /host_dev_src:/container_src 的 docker 容器中与 Node.js 一起运行,以便我可以测试.

然后当我想发送它们进行测试时:我提交了容器并推送了一个新版本。但是当我在测试机上拉取并运行镜像时,源代码不见了。这是有道理的,因为在测试机中没有 /host_src 可用。

我目前的解决方法是在测试机器上克隆源代码并运行 docker 和 -v /host_test_src:/container_src。但我想知道是否可以将源代码直接复制到容器中并避免这种操作。我更愿意使用源代码复制、粘贴和运行图像文件,特别是因为我们的测试机器上没有 Internet 连接。

PS:似乎docker cp只支持从容器复制文件到主机。

请将您的源代码视为数据,然后将其打包为数据容器,参见https://docs.docker.com/userguide/dockervolumes/

步骤 1 创建 app_src docker 图片

将一个 Dockerfile 放入您的 git 仓库中,例如

FROM BUSYBOX
ADD . /container_src
VOLUME /container_src

然后你可以像

一样构建源图像
docker build -t app_src .

在开发期间,您始终可以使用旧的解决方案-v /host_dev_src:/container_src

第 2 步传输此 docker 图片,如应用图片

您可以将此 app_src 映像传输到类似于您的应用程序映像的测试系统,可能是通过 docker 注册表

步骤 3 运行 作为数据容器

在测试系统中,运行 app 容器位于其上方。 (我使用 ubuntu 进行演示)

docker run -d -v /container_src --name code app_src
docker run -it --volumes-from code ubuntu bash
root@dfb2bb8456fe:/# ls /container_src
Dockerfile  hello.c
root@dfb2bb8456fe:/#

希望对大家有所帮助

(感谢 https://github.com/toffer/docker-data-only-container-demo ,我得到了详细的想法)

一种解决方案是在 Dockerfile 中执行 git 克隆步骤,将源代码添加到映像中。在开发过程中,您可以使用 docker run-v 参数覆盖此代码,这样您就可以在不重新构建的情况下进行更改。在测试方面,您只需检查您的更改并构建一个新图像。现在你有一个完全独立的单独图像用于测试。

请注意,如果您的 Dockerfile 中有 VOLUME 指令,您需要确保它出现在 git 克隆步骤之后。

这种方法的问题在于,如果您使用的是编译语言,您只希望二进制文件存在于最终映像中。在这种情况下,git 克隆需要替换为一些获取或编译二进制文件的代码。

您可以尝试拥有两个 Dockerfile。 base 人会知道如何从预先定义的文件夹中 运行 您的应用程序,但 不会 将其声明为卷。在开发时,您将 运行 将此容器与您的主机文件夹作为一个卷安装。另一个 package 将继承 base 和 copy/add 主机目录中的文件,同样没有卷,因此您可以将所有文件传送到测试仪的主机。

添加到 Adrian 的回答中,我 git 克隆,然后

CMD git pull && start-my-service

所以签出分支的最新代码得到 运行。这显然不适合所有人,但它适用于某些软件发布模型。