dockerized cron 작업 설정: PHP 및 MySQL을 사용하는 예
프로그램이나 데이터베이스 구조는 해당 예제와 관련이 없으며 Docker에서 크론 실행이라는 한 가지에만 초점을 맞춘 최소한의 예제를 설정하는 수단일 뿐입니다.
이제 시작하여 IDE에서 새 프로젝트를 생성해 봅시다!
전제 조건
PHP 코드
하나의 스크립트에 포함된 미리 정의된 테이블에 행을 삽입하는 코드는 다음과 같습니다. 이를 호출하고
test_cron.php
프로젝트의 루트에 배치합니다 =><?php
echo "connecting to DB".PHP_EOL;
if( in_array ('pdo_mysql', get_loaded_extensions())) {
// ! this code is bad, credentials are not read from a file or from env variables !
$dsn = "mysql:host=db;dbname=test_db";
$opt = [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC];
echo "connected to DB".PHP_EOL;
try {
$connection = new PDO($dsn, "root", '', $opt);
$val = 'testStr';
// nothing is dynamic here, this code really sucks !
$sql = 'INSERT INTO test_table(test_field) VALUES(:val)';
$statement = $connection->prepare($sql);
$statement->execute([
':val' => $val
]);
} catch (\PDOException $pdoe) {
echo $pdoe->getMessage();
}
}
... 글쎄, 당신은 아이디어를 얻습니다. 댓글은 스스로 말합니다 :)
이것이 cron에서 주기적으로 실행할 스크립트입니다.
그러나 이를 실행하려면 데이터베이스와 쓸 기존
test_table
이 있어야 합니다.테스트 SQL 테이블
테스트 테이블을 생성하는 SQL 스크립트를 작성해 보겠습니다. 데이터베이스 생성은 이 문서의 후반부
docker-compose
에서 다룰 것입니다. 이 파일table.sql
을 호출하고 프로젝트의 루트에도 넣습니다.CREATE TABLE IF NOT EXISTS `test_table` (
`id` MEDIUMINT NOT NULL AUTO_INCREMENT,
`test_field` varchar(255)
) ENGINE=InnoDB;
이제 cron 구성 부분으로 이동하겠습니다.
크론 탭 실행
cron
패키지가 설치된 Linux 시스템에서 각 사용자는 crontab
. crontab
는 작업 스케줄러를 나타내는 파일로, 사용자는 주기적으로 실행해야 하는 작업을 거기에 기록하기만 하면 됩니다. 이러한 작업의 빈도를 정의하는 구문이 있습니다. 더 나은 느낌을 얻으려면 멋진https://crontab.guru/ 웹 사이트를 확인하는 것이 좋습니다!따라서 다음 단계에서 Docker 이미지 정의에서 사용할 이 항목
crontab
을 작성해 보겠습니다. 프로젝트의 루트에 확장명 없이 crontab
라는 파일을 생성하기만 하면 됩니다.# run the test script every minute and output whatever it echoes in a log file
* * * * * /usr/local/bin/php /cron_scripts/test_cron.php > /cron_scripts/test_cron.log 2>&1
PHP cron을 실행하기 위한 Dockerfile
이제 일정에 따라 스크립트를 실행하는 데 사용할 Docker 이미지를 정의하겠습니다. 이것은
Dockerfile
라고 불릴 것입니다. 그것은 프로젝트의 루트에도 있습니다 :) 간단하게 유지합시다!FROM php:8.1-cli
# installing cron package
RUN apt-get update && apt-get -y install cron
# installing PHP PDO extension to talk to MySQL
RUN docker-php-ext-install pdo_mysql
# putting our test PHP script somewhere in the filesystem
RUN mkdir /cron_scripts
WORKDIR /cron_scripts
COPY test_cron.php /cron_scripts
# creating the log file that will be written to at each cron iteration
RUN touch test_cron.log
# copy the crontab in a location where it will be parsed by the system
COPY ./crontab /etc/cron.d/crontab
# owner can read and write into the crontab, group and others can read it
RUN chmod 0644 /etc/cron.d/crontab
# running our crontab using the binary from the package we installed
RUN /usr/bin/crontab /etc/cron.d/crontab
이제 이 모든 것을 함께 맞추기 위해 누락된 단 하나의 퍼즐 조각이 있습니다. 바로 이 모든 것을 조율하는
docker-compose.yml
파일입니다!도커 작성
version: "3.9"
# persisting db data in volume
volumes:
db-vol:
services:
# We have 4 services: the database, the db seeder, a cron that writes in db, and phpmyadmin to see the results of our running cron in a friendly UI
db:
image: mysql:latest
container_name: db
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "true"
# this is the name of our database, that will be created automatically
MYSQL_DATABASE: test_db
restart: unless-stopped
volumes:
- db-vol:/var/lib/mysql
ports:
- "3306:3306"
# we'll use a seeder container to create our test table, that our scheduled PHP script will write to
db_seeder:
image: mysql:latest
# we copy our table creation script into the container
volumes:
- ./table.sql:/table.sql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "true"
# we give the db time to initialize then we import our SQL script
entrypoint: [ "bash", "-c", "sleep 10 && mysql --user=root --host=db --port=3306 test_db < /table.sql && exit"]
depends_on:
- db
# this is the container that will execute our cron
cron:
build:
context: ./
dockerfile: ./Dockerfile
# run crond as main process of container
entrypoint: [ "bash", "-c", "cron -f"]
depends_on:
- db_seeder
# our nice UI to browse our test table
phpmyadmin:
image: phpmyadmin:latest
restart: unless-stopped
ports:
- 8080:80
environment:
# we specify that we connect to an arbitrary server with the flag below
# "arbitrary" means you're able to specify which database server to use on login page of phpmyadmin
- PMA_ARBITRARY=1
depends_on:
- db_seeder
하자
docker compose up
이것!모든 것이 잘 작동하는지 확인
모든 컨테이너가 시작되고 db 시더가 코드 0으로 종료된 후(db 시딩이 잘 되었다는 의미); 정의된 일정에 따라 테이블이 작성되는지 확인하겠습니다.
이를 위해
phpmyadmin
인스턴스를 확인하여 테이블을 찾아보겠습니다. docker-compose.yml
파일에서 phpmyadmin
가 호스트 시스템의 포트 8080에서 액세스할 수 있도록 지정했으므로 http://localhost:8080으로 이동합니다. 서버는 db
이고 사용자는 root
이며 암호를 설정하지 않았습니다.일단 들어가면 UI의 왼쪽에 우리가 만든 테스트 테이블이 표시됩니다. 클릭하고 찾아보세요. 매분 페이지를 새로 고치면 새 행이 추가되는 것을 볼 수 있습니다 😎 .
이제 컨테이너에 복사한 cron 로그 파일을 확인하고
test_cron.log
파일로 이동합니다. 이 파일은 매분 업데이트되어야 합니다!이제 당신은 훌륭한 초능력을 배웠습니다. Linux Dockerized 환경에서 일정에 따라 작업을 자동화합니다. 이것은 db 테이블에 행을 삽입하는 것 외에 무한한 사용 사례를 가질 수 있습니다. 당신의 상상력이 한계입니다.
이 예제의 코드는 https://github.com/yactouat/docker-cron-example에서 찾을 수 있습니다.
즐거우셨길 바라며 또 만나요 👋
Reference
이 문제에 관하여(dockerized cron 작업 설정: PHP 및 MySQL을 사용하는 예), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/yactouat/setting-up-dockerized-cron-jobs-example-using-php-and-mysql-272j텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)