我已经对一个Node项目进行了docker化。该项目生成文件。
无论何时销毁容器,我都会丢失所有生成的文件。我正在考虑使用“ SIGTERM”事件,并在容器即将被破坏时执行git push。
在这种情况下还有其他方法可以使用吗?
答案 0 :(得分:2)
您可以使用bind mounts
(请参阅this answer)。它允许从容器访问主机文件系统,这意味着容器即使退出也可以将文件存储在主机可用的目录中。
对于您而言,这意味着项目将使用容器本地的文件路径在某个文件夹中生成文件,而您仍将使用主机系统路径从外部看到更改。
答案 1 :(得分:1)
据我了解,您希望能够在销毁容器之前将文件保存在容器中。您有几种可能性:
答案 2 :(得分:1)
在我们的CI框架中,我们使用Jenkins和Docker。 Jenkins启动一个Docker容器,然后在该容器中运行命令以构建一些软件。完成软件构建后,容器内的构建脚本会发出命令,该命令将容器作为映像提交并存档到Docker注册表中。该映像包含所有临时文件和工具配置。这样一来,我们就可以稍后从存档的映像重新创建容器,并在所有相关性和生成的文件都已就位的情况下重新运行测试。
可以从容器内部运行以下脚本:
#!/usr/bin/env bash
set -ex
# The docker registry should be located at a hostname:port address. (see push ref link below)
REGISTRY=TESTRACK:5000
TAG=${2}
CONTAINER_NAME=${1}
function get-container-id() {
# When executed from within a docker container, the kernel cgroup file contains a control group for docker processes
# The container id of the current container (from within that container) can be fetched this way.
cat /proc/self/cgroup | grep "cpuset:/docker" | sed 's/\([0-9]\+\):cpuset:\/docker\///g'
# Below, using head, is less reliable; the docker line is not always the first line in the cgroup
# head -1 /proc/self/cgroup | cut -d/ -f3
}
CONTAINER_ID=$(get-container-id)
if [ -z ${CONTAINER_ID} ]; then
echo "Error. Did not find a docker container value!"
exit 1
fi
# https://docs.docker.com/engine/reference/commandline/commit/#examples
docker commit ${CONTAINER_ID} ${REGISTRY}/${CONTAINER_NAME}:$TAG
docker tag ${REGISTRY}/${CONTAINER_NAME}:$TAG ${REGISTRY}/${CONTAINER_NAME}:latest
#remove existing images without tags
OLD=`docker images -f "reference=TESTRACK-1:5000/$CONTAINER_NAME" -f "dangling=true" -q`
if [ -n "${OLD}" ]; then
docker rmi -f ${OLD} || true
fi
# https://docs.docker.com/engine/reference/commandline/push/
#do not show push progress
docker push ${REGISTRY}/${CONTAINER_NAME}:$TAG &> push_result_tag.txt
docker push ${REGISTRY}/${CONTAINER_NAME}:latest &> push_result.txt
请注意,只有在该容器有权访问Docker守护程序的情况下,您才能在该容器中运行此脚本。因此,您应该启动一个可以访问docker daemon套接字
的容器 -v /var/run/docker.sock:/var/run/docker.sock