将cron添加到Docker映像

时间:2018-11-01 20:56:05

标签: docker

我从python映像创建了一个Docker容器来托管Django项目。现在,我想运行一些cron作业来更新Django项目中的数据。

但是,由于我是使用python图片创建的,因此cron不可用。

我还是Docker的新手,所以我不确定最简单的方法是什么。我应该尝试在python映像中添加cron功能,还是应该切换到更通用的映像,例如Ubuntu,这将允许我发出标准的apt install cron命令?

我看到也有croncrontab图像。 Docker是否支持叠加多个图像(例如python + crontab),还是仅使用Ubuntu会更容易?

1 个答案:

答案 0 :(得分:1)

泊坞窗的优点在于,您可以拍摄已经存在的图像并根据自己的需要进行调整。无需从头开始。艾格斯认为,最简单的路线是需要最少步骤或最适合您的路线。

第一个选项-Dockerfile

假设您使用python:latest标签,然后使用cron创建自己的图像,如下所示:

FROM python:latest
LABEL maintainer="John Doe"

RUN apt-get install -y update && \
    apt-get install -y cron && \
    apt-get clean all

真的很容易吧?而且您不必担心在ubuntu映像上安装python和Django依赖项(不只是安装一个应用程序,还有更多步骤)。现在您需要构建此图像:

docker build --tag 'foo-image:latest' --no-cache /path/to/dockerfile

现在您可以使用foo-image,它将安装cron并具有python映像的所有功能。

如果除了安装还需要对cron进行更多处理,还可以将其添加到Dockerfile中。但是我不知道您的用例的任何细节。

第二个选项-docker commit

  1. 运行python图像容器
  2. 执行到其中
  3. 进行调整(安装,运行流程,添加用户等)
  4. 将此容器提交到新图像

docker commit的虚拟示例:

$ docker run -dit --name=Nginx -p 80:80 nginx
68188c608160754736f192d535742b9d0dfbc3c09564c1731741c08c211b219f
$ docker exec -it Nginx /bin/bash
root@68188c608160:/# touch New_file
root@68188c608160:/# apt-get update     
Get:2 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Ign:1 http://cdn-fastly.deb.debian.org/debian stretch InRelease                                   
Get:3 http://cdn-fastly.deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Get:5 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [454 kB]
Get:4 http://cdn-fastly.deb.debian.org/debian stretch Release [118 kB]
Get:6 http://cdn-fastly.deb.debian.org/debian stretch Release.gpg [2434 B]              
Get:7 http://cdn-fastly.deb.debian.org/debian stretch-updates/main amd64 Packages [5152 B]
Get:8 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 Packages [7099 kB]
Fetched 7864 kB in 4s (1767 kB/s)    
Reading package lists... Done
root@68188c608160:/# exit
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES
68188c608160        nginx               "nginx -g 'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   Nginx
$ docker commit Nginx nginx-updated:latest
sha256:dcc2f09f523eded0b2d33abb47e99b83453c12fb6ba958b441111f9ff40c5a8a
$ docker images
REPOSITORY                                                        TAG                 IMAGE ID            CREATED             SIZE
nginx-updated                                                     latest              dcc2f09f523e        3 seconds ago       156MB
nginx            

对我来说,我更喜欢使用Dockerfiles。我仅在不确定要执行某些用例需要采取哪些步骤时才使用2nd选项。但是无论如何,我仍然将这些更改添加到Dockerfile中。