我想设置一个cron作业来在docker容器中运行一组命令,然后将更改提交到docker镜像。我能够将容器作为守护程序运行,并使用以下命令获取容器ID:
CONTAINER_ID=$(sudo docker run -d my-image /bin/sh -c "sleep 10")
但我遇到了第二部分的问题 - 一旦sleep 10
命令完成,就会对图像进行更改。有没有办法让我告诉Docker容器即将被杀死并在它之前运行另一个命令?
编辑:作为替代方法,是否有办法通过容器中的shell脚本触发ctrl-p-q
以使容器保持运行但返回主机?
答案 0 :(得分:10)
有以下方法可以保存容器数据:
Docker卷
Docker提交
a)从ubuntu映像创建容器并运行bash终端。
# apt-get update
# apt-get install curl
b)终端内部安装curl
# exit
c)退出集装箱码头
$ docker ps -a
d)执行以下命令记下您的容器ID:
$ docker commit <container_id> new_image_name:tag_name(optional)
e)将容器保存为新图像
$ docker images
$ docker run -it new_image_name:tag_name bash
# which curl
/usr/bin/curl
f)确认您可以在安装了curl的情况下看到新图像。
{{1}}
答案 1 :(得分:5)
在前台运行它,而不是守护进程。当它结束时,启动它的脚本需要控制并提交/推送它
答案 2 :(得分:1)
我没有找到任何令人满意的答案,因为我的目标是1)启动一个容器,2)运行设置脚本,3)设置后捕获/存储状态,因此我可以立即运行各种脚本反对那个状态。而且都在本地,自动化,连续的集成环境中(例如,脚本化和非交互式)。
这是我想出的方法(我在Travis-CI install
部分中运行了它)来设置测试环境:
#!/bin/bash
# Run a docker with the env boot script
docker run ubuntu:14.04 /path/to/env_setup_script.sh
# Get the container ID of the last run docker (above)
export CONTAINER_ID=`docker ps -lq`
# Commit the container state (returns an image_id with sha256: prefix cut off)
# and write the IMAGE_ID to disk at ~/.docker_image_id
(docker commit $CONTAINER_ID | cut -c8-) > ~/.docker_image_id
请注意,我的基本图片是ubuntu:14.04
,但您的图片可以是您想要的任何图片。
通过该设置,现在我可以对此快照运行任意数量的脚本(例如单元测试)(对于Travis,这些脚本在我的script
部分中)。例如:
docker run `cat ~/.docker_image_id` /path/to/unit_test_1.sh
docker run `cat ~/.docker_image_id` /path/to/unit_test_2.sh
答案 3 :(得分:0)
如果要为所有正在运行的程序进行自动提交,请尝试此操作。把它放在一个cron或其他东西,如果这有帮助
#!/bin/bash
for i in `docker ps|tail -n +2|awk '{print $1}'`; do docker commit -m "commit new change" $i; done