Прелесть докера в том, что вы можете взять уже существующее изображение и настроить его под свои нужды. Там нет необходимости делать с нуля. Думаю, самый простой маршрут - это тот, который требует наименьшего количества шагов или просто подходит вам больше всего.
Первый вариант - 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
Действительно легко, верно? И вам не нужно беспокоиться об установке зависимостей python и Django в образ ubuntu (было бы гораздо больше шагов, чем просто установка одного приложения). Теперь вам нужно построить этот образ:
docker build --tag 'foo-image:latest' --no-cache /path/to/dockerfile
Теперь вы можете использовать foo-образ, на котором будет установлен cron и все, что есть на образе питона.
Если вам нужно сделать больше с cron, то помимо установки его также можно добавить в Dockerfile. Но я не знаю никаких особенностей вашего варианта использования.
Второй вариант - фиксация Docker
- Запустить контейнер с изображением питона
- Exec в него
- Выполните ваши настройки (установить, запустить процесс, добавить пользователя и т. Д.)
- Зафиксируйте этот контейнер в новом образе
Фиктивный пример 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. Я использую 2-й вариант, только когда я не уверен, какие шаги нужно сделать, чтобы выполнить определенный сценарий использования. Но в любом случае после этого я все равно добавлю эти изменения в Dockerfile.