Как запустить cron в контейнере MariaDB? - PullRequest
2 голосов
/ 28 июня 2019

Я хочу включить задачу cron в контейнер MariaDB, основываясь на последнем образе mariadb, но я застрял с этим.

Я пробовал многие вещи без успеха, потому что не могу запуститьи MariaDB, и Cron.

Вот мой фактический dockerfile:

FROM mariadb:10.3

# DB settings
ENV MYSQL_DATABASE=beurre \
    MYSQL_ROOT_PASSWORD=beurette

COPY ./data /docker-entrypoint-initdb.d
COPY ./keys/keys.enc home/mdb/
COPY ./config/encryption.cnf /etc/mysql/conf.d/encryption.cnf

# Installations
RUN apt-get update && apt-get -y install python cron

# Cron
RUN touch /etc/cron.d/bp-cron
RUN printf '* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1\n#' >> /etc/cron.d/bp-cron
RUN touch /var/log/cron.log
RUN chmod 0644 /etc/cron.d/bp-cron

RUN cron

При своих настройках база данных запускается правильно, но «Cron» не инициализируется.Чтобы заставить его работать, я должен войти в контейнер и выполнить команду "Cron", и все работает отлично.

Так что я ищу способ запустить db и cron из моего используемого Dockerfileв моем docker-compose.

Если это невозможно, может быть, есть другой способ выполнить запланированные задачи?Цель состоит в том, чтобы выполнить сценарий базы данных.

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

Разрабатывая комментарий @ k0pernikus, я бы порекомендовал использовать отдельный контейнер, в котором работает cron. Затем cronjobs в этом контейнере могут работать с вашей базой данных mysql.

Вот как бы я подошел к этому:

1. Создать контейнер Cron Docker

Вы можете установить контейнер cron довольно просто. Вот пример Dockerfile, который должен выполнять эту работу:

FROM alpine
COPY ./crontab /etc/crontab
RUN crontab /etc/crontab
RUN touch /var/log/cron.log
CMD crond -f

Просто поместите ваш crontab в файл crontab рядом с этим Dockerfile, и у вас должен быть рабочий контейнер cron.

Пример файла crontab:

* * * * * mysql -h mysql --execute "INSERT INTO database.table VALUES 'v';"

2. Добавьте контейнер cron в ваш docker-compose.yml в качестве службы

Убедитесь, что вы добавили свой контейнер cron в docker-compose.yml и поместили его в ту же сеть, что и ваша служба mysql:

networks:
    my_network:
services:
    mysql:
        image: mariadb
        networks:
          - my_network
    cron:
        image: my_cron
        depends_on: 
          - mysql
        build:
            context: ./path/to/my/cron-docker-folder
        networks:
          - my_network
0 голосов
/ 28 июня 2019

Я рекомендую решение , предоставленное fjc .Рассматривайте это как полезную информацию, чтобы понять, почему ваш подход не работает.


В Docker есть RUN команды, которые выполняются только во время сборки.Не при запуске контейнера.

У него также есть CMD (или ENTRYPOINT) для выполнения определенных сценариев.

Поскольку вы используете mariadb ваш CMD, это:

ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 3306
CMD ["mysqld"]

(Вы можете найти ссылку на фактические Dockerfles на dockerhub .)

Это заставляет Docker работать:

docker-entrypoint.sh mysqld

наstartup.

Вам также необходимо переопределить docker-entrypoint.sh, чтобы разрешить запуск задания cron.


См. соответствующую часть файла Docker дляинструкция CMD :

CMD Инструкция CMD имеет три формы:

CMD ["исполняемый файл", "param1", "param2"] (форма exec, этопредпочтительная форма) CMD ["param1", "param2"] (в качестве параметров по умолчанию для ENTRYPOINT) команда CMD param1 param2 (форма оболочки) В Dockerfile может быть только одна инструкция CMD.Если вы укажете более одного CMD, то вступит в силу только последний CMD.

Основная цель CMD - предоставить значения по умолчанию для исполняющего контейнера.Эти значения по умолчанию могут включать в себя исполняемый файл или могут не включать исполняемый файл, и в этом случае вы также должны указать инструкцию ENTRYPOINT.

Примечание: Если CMD используется для предоставления аргументов по умолчанию для инструкции ENTRYPOINT, то оба CMDи инструкции ENTRYPOINT должны указываться в формате массива JSON.

Примечание. Форма exec анализируется как массив JSON, что означает, что вы должны использовать двойные кавычки («) вокруг слов, а не одинарных кавычек (').

Примечание. В отличие от формы оболочки, форма exec не вызывает командную оболочку.Это означает, что обычная обработка оболочки не происходит.Например, CMD ["echo", "$ HOME"] не будет выполнять подстановку переменных в $ HOME.Если вы хотите обработать оболочку, то либо используйте форму оболочки, либо выполните оболочку напрямую, например: CMD ["sh", "-c", "echo $ HOME"].При использовании формы exec и непосредственном выполнении оболочки, как в случае с формой оболочки, именно оболочка выполняет расширение переменной среды, а не docker.

При использовании в форматах оболочки или exec,Инструкция CMD устанавливает команду, которая будет выполняться при запуске образа.

Если вы используете форму оболочки CMD, то она будет выполнена в / bin / sh -c:

FROM ubuntuCMD эхо "Это тест".|wc - если вы хотите запустить свой без оболочки, вы должны выразить команду в виде массива JSON и указать полный путь к исполняемому файлу.Эта форма массива является предпочтительным форматом CMD.Любые дополнительные параметры должны быть индивидуально выражены в виде строк в массиве:

FROM ubuntu CMD ["/ usr / bin / wc", "- help"] Если вы хотите, чтобы ваш контейнер запускал один и тот же исполняемый файл каждый развремя, то вы должны рассмотреть возможность использования ENTRYPOINT в сочетании с CMD.См. ENTRYPOINT.

Если пользователь указывает аргументы для запуска докера, он переопределяет значение по умолчанию, указанное в CMD.

Примечание. Не путайте RUN с CMD.RUN фактически запускает команду и фиксирует результат;CMD ничего не выполняет во время сборки, но указывает целевую команду для образа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...