Cannot start apache automatically with docker

15,796

Solution 1

Docker services have to be running in the foreground. In your Dockerfile, RUN service apache2 restart will start apache as background process. Hence the container will exit.

To run apache in the foreground, add the following to the Dockerfile.

CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

FROM ubuntu:latest
RUN apt-get update && apt-get install -y apache2 php libapache2-mod-php php-mcrypt php-mysql php-cli php-curl php-xml php-intl php-mbstring git vim composer curl

COPY . /var/www/example
COPY vhost.conf /etc/apache2/sites-available/example.conf

RUN a2ensite example
RUN chown -R www-data:www-data /var/www/example/logs
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

Solution 2

The above answer is probably correct that mentioned that you can start it with:

CMD apachectl -D FOREGROUND

With docker it is sometimes a good idea to use the absolute path to a binary. So for example maybe do this instead:

/usr/sbin/apache2 -D FOREGROUND

I had a look a bit on google to see what other people are doing. I found this example of a dockerfile where the guy mentions a script start.sh: From here: https://github.com/jacksoncage/apache-docker/blob/master/Dockerfile

EXPOSE 80
ADD start.sh /start.sh
RUN chmod 0755 /start.sh
CMD ["bash", "start.sh"]

Here is the start.sh script: https://github.com/jacksoncage/apache-docker/blob/master/start.sh

Which simply just does:

#!/bin/bash

# Start apache
/usr/sbin/apache2 -D FOREGROUND

Unrelated tip: Your dockerfile you need to pin the version for Ubuntu. See: https://nickjanetakis.com/blog/docker-tip-18-please-pin-your-docker-image-versions

Let me know if this helps.

Share:
15,796
Karim Mtl
Author by

Karim Mtl

Updated on June 13, 2022

Comments

  • Karim Mtl
    Karim Mtl almost 2 years

    I made a simple custom docker setup for php development. So far everything works as expected. The only thing that I cannot figure out is why apache2 does not start automatically.

    Here is my dockerfile:

    FROM ubuntu:latest
    RUN apt-get update && apt-get install -y apache2 php libapache2-mod-php php-mcrypt php-mysql php-cli php-curl php-xml php-intl php-mbstring git vim composer curl
    
    COPY . /var/www/example
    COPY vhost.conf /etc/apache2/sites-available/example.conf
    
    RUN a2ensite example
    RUN chown -R www-data:www-data /var/www/example/logs
    RUN service apache2 restart
    

    And here is my docker-compose.yml:

    version: '2'
    services:
      app:
        build:
          context: .
          dockerfile: Dockerfile
        image: myexampleapp
        ports:
            - 8080:80
        tty: true
    

    And here is the output docker-compose up command:

    me@mydell:~/workspace/mydockercompose$ docker-compose up -d --build
    Creating network "mydockercompose_default" with the default driver
    Building app
    Step 1/7 : FROM ubuntu:latest
     ---> f975c5035748
    Step 2/7 : RUN apt-get update && apt-get install -y apache2 php libapache2-mod-php php-mcrypt php-mysql php-cli php-curl php-xml php-intl php-mbstring git vim composer curl
     ---> Using cache
     ---> 148c3a9d928a
    Step 3/7 : COPY . /var/www/example
     ---> 1fbc1dbacf1e
    Step 4/7 : COPY vhost.conf /etc/apache2/sites-available/example.conf
     ---> 9c08947b09e9
    Step 5/7 : RUN a2ensite example
     ---> Running in 1ef64defe747
    Enabling site example.
    To activate the new configuration, you need to run:
      service apache2 reload
    Removing intermediate container 1ef64defe747
     ---> ca1c8e7e80fc
    Step 6/7 : RUN chown -R www-data:www-data /var/www/example/logs
     ---> Running in 57b0214be7a0
    Removing intermediate container 57b0214be7a0
     ---> b3b270a36bf4
    Step 7/7 : RUN service apache2 restart
     ---> Running in 09d2b1d3bd91
     * Restarting Apache httpd web server apache2
    AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
       ...done.
    Removing intermediate container 09d2b1d3bd91
     ---> 19fa9a90f9de
    Successfully built 19fa9a90f9de
    Successfully tagged myexampleapp:latest
    Creating mydockercompose_app_1
    

    It shows clearly that apache was restarted successfully. However it actually does not:

    me@mydell:~/workspace/mydockercompose$ docker exec -i -t 20add8ad9895 service apache2 status
     * apache2 is not running
    

    I am new to docker, so all suggestions (even if they are not answering this specific question) to improve what I am doing so far are welcome.

    Thanks

  • Karim Mtl
    Karim Mtl about 6 years
    I was able to make it run using the start script but with some tweaking ...
  • Karim Mtl
    Karim Mtl about 6 years
    here is the command that worked for me: CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
  • OpenBSDNinja
    OpenBSDNinja about 6 years
    Glad to hear that. Thanks for feeback :)
  • kiwicomb123
    kiwicomb123 over 2 years
    The "/usr/sbin/apachectl" WORKS, but "apachectl" does NOT.