gpt4 book ai didi

php - 如何在同一容器中运行cron和Web应用程序?

转载 作者:行者123 更新时间:2023-12-02 20:29:46 25 4
gpt4 key购买 nike

我是Docker的新手。我几乎没有将我的php应用程序容器化以在Web界面中运行它。但是我有一些时间表。我学习了如何创建单独的cron镜像并从How to run a cron job inside a docker container?运行它。但是我的用例是不同的。 我需要使用我的PHP应用程序容器中的php文件,这似乎是不可能的。我尝试按照以下方式创建docker-compose.yml以查看它是否有效
docker-compose.yml:

    version: "3"

services:
app:
build:
context: ./docker/php
container_name: 'app'
restart: 'always'
ports:
- "80:80"
- "443:443"
links:
- db
volumes:
- ${DOCUMENT_ROOT-./src}:/var/www/html
- ${PHP_INI-./docker/php/php.ini}:/usr/local/etc/php/php.ini
- ${VHOSTS_DIR-./docker/apache2/vhosts}:/etc/apache2/sites-enabled
- ${LOG_DIR-./docker/logs/apache2}:/var/log/apache2
extra_hosts:
- "test.local:127.0.0.1"
hostname: cloudservice.local
domainname: local
#entrypoint: sh /var/www/html/cron.sh
正如我在这里评论的入口点,如果我做了docker-compose,一切工作都很好,我的Dockerfile如下
Dockerfile:
    FROM php:7.2.27-apache

RUN apt-get update
RUN apt-get install -y cron
RUN apt-get -y update --fix-missing
RUN apt-get upgrade -y

# Install useful tools
RUN apt-get -y install apt-utils nano wget dialog

# Install important libraries
RUN apt-get -y install --fix-missing apt-utils build-essential git curl libcurl4 libcurl4-openssl-dev zip

# Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Install xdebug
#RUN pecl install xdebug-2.5.0
#RUN docker-php-ext-enable xdebug

# Other PHP7 Extensions

RUN apt-get -y install libsqlite3-dev libsqlite3-0 default-mysql-client
RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install pdo_sqlite
RUN docker-php-ext-install mysqli

RUN docker-php-ext-install curl
RUN docker-php-ext-install tokenizer
RUN docker-php-ext-install json

RUN apt-get -y install zlib1g-dev
RUN docker-php-ext-install zip

RUN apt-get -y install libicu-dev
RUN docker-php-ext-install -j$(nproc) intl

RUN docker-php-ext-install mbstring

RUN apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
RUN docker-php-ext-install -j$(nproc) gd

RUN pecl install redis-5.1.1 \
&& docker-php-ext-enable redis

# Enable apache modules
RUN a2enmod rewrite headers
我的cron.sh文件如下
#!/usr/bin/env bash

# Ensure the log file exists
touch /var/www/html/logs/crontab.log

# Ensure permission on the command
chmod a+x /var/www/html/cron-local/hn-shc-rapid-daily.sh

# Added a cronjob in a new crontab
echo "* * * * * bash /var/www/html/cron-local/hn-shc-rapid-daily.sh >> /var/www/html/logs/crontab.log 2>&1" > /etc/crontab

# Registering the new crontab
crontab /etc/crontab

# Starting the cron
/usr/sbin/service cron start

# Displaying logs
# Useful when executing docker-compose logs mycron
tail -f /var/www/html/logs/crontab.log
但是在评论了入口点之后,我无法运行cron。如果我不评论入口点,那么cron会运行,而我的Web应用程序不会。有可能解决这个问题吗?
谢谢

最佳答案

我认为最好在docker-compose文件中指定入口点,但不要在其前面添加“sh”。请记住,在docker-compose文件中声明新的入口点会覆盖dockerfile中的入口点。 Link
我建议您创建自己的入口点脚本,该脚本将在容器CMD ["/entrypoint.sh"]中执行您的任务
例:
创建一个文件并命名为“entrypoint.sh”或其他名称,然后将其保存在Dockerfile所在的文件夹中。在此文件中,从cron.sh中推送您的内容。

RUN apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
RUN docker-php-ext-install -j$(nproc) gd

RUN pecl install redis-5.1.1 \
&& docker-php-ext-enable redis

# Enable apache modules
RUN a2enmod rewrite headers

COPY entrypoint.sh /

RUN chmod +x /entrypoint.sh

CMD ["/entrypoint.sh"]
但是您也可以直接将cron直接添加到docker文件中。
...
# Enable apache modules
RUN a2enmod rewrite headers

COPY your-cron.cron /

RUN crontab /your-cron.cron
...

关于php - 如何在同一容器中运行cron和Web应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64183620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com