1

I am new to docker. Hardly I have containerized my php application to run it in the web interface. But I have some cron to run with it. I learnt how to create separate cron image and run it from How to run a cron job inside a docker container?. But my use case is different. I need to use the php files from my php application container which seems not possible from my way. I tried creating the docker-compose.yml as follow to see if it would work

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

As I have commented entry point here and if I do docker-compose up, everything works perfectly fine, My Dockerfile is as under

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

My cron.sh file is as under

#!/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

But with the entry point commented, i cannot run cron. If i don't comment entrypoint, then cron runs, my web application doesn't. Is there any possibility to fix this?

Thanks

Tekraj Shrestha
  • 1,228
  • 3
  • 20
  • 48

2 Answers2

1

At the end of the docker file i added the following code after removing

RUN a2enmod rewrite headers

    # Copy hello-cron file to the cron.d directory
    COPY hello-cron /etc/cron.d/hello-cron #just any name

    # Give execution rights on the cron job
    RUN chmod 0644 /etc/cron.d/hello-cron

    # Apply cron job
    RUN crontab /etc/cron.d/hello-cron

    # Create the log file to be able to run tail
    RUN touch /var/log/cron.log

    # Enable apache modules
    RUN a2enmod rewrite headers
    
    CMD cron && /usr/sbin/apache2ctl -D FOREGROUND

and cron.sh was changed to

    * * * * * echo "hello world" >> /var/www/html/logs/crontab.log 2>&1

This worked for me. I need not have to add entry neither on docker-compose nor on docker file, but I guess entry also would work. I don't know if this is the right way to do. If anyone would give me more advance idea, I would be happy to give it a try. Thanks

Tekraj Shrestha
  • 1,228
  • 3
  • 20
  • 48
  • I am facing the same issue!! can you plz post your yml, dockerfile and cron.sh file altogether with their location, I know it's a lot to ask but I think u really can help !!. – Gobinda Nandi Jan 14 '21 at 20:21
  • Its already posted here or you can send me the live editor link and i will paste everything there. Thanks – Tekraj Shrestha Jan 28 '21 at 07:35
0

I think it's better if you specify the entry point in the docker-compose file without "sh" in front of it. Remember that declaring a new entrypoint in the docker-compose file overwrites the entrypoint in the dockerfile. Link

I would advise you to create your own Entrypoint Script which will execute your crons in the container CMD ["/entrypoint.sh"]

Example:

Create an file and named "entrypoint.sh" or whatever and save it in the same folder where your Dockerfile is located. In this file push your Content from your 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"]

But you could also just add your cron directly in the docker file.

...
# Enable apache modules
RUN a2enmod rewrite headers

COPY your-cron.cron /
    
RUN crontab /your-cron.cron 
...
Gregor Wedlich
  • 654
  • 6
  • 14