How to restart apache2 without terminating docker

2020-05-22 01:45发布

问题:

I am using as a base the php docker container with the tag:

php:5.6-apache

When I try to restart the apache2 inside the container, the container stops:

root@phalconapp:/var/www/html# service apache2 restart
Restarting web server: apache2Terminated
root@phaclonapp:/var/www/html#
me@myLocalComputer:

How to restart apache2 without stopping the container?

I want to play around with the container and customize it, before I put my changes into the dockerfile. I want to install some extension and for them to work I need to restart apache for the changes to take effect.

This is the log file via:

Attaching to dltasklight_phlaconapp_1
phlaconapp_1 | 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
phlaconapp_1 | 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
phlaconapp_1 | [Mon May 30 10:19:24.556154 2016] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.6.22 configured -- resuming normal operations
phlaconapp_1 | [Mon May 30 10:19:24.556181 2016] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
phlaconapp_1 | [Mon May 30 10:21:11.754993 2016] [mpm_prefork:notice] [pid 1] AH00169: caught SIGTERM, shutting down
dltasklight_phlaconapp_1 exited with code 0

回答1:

If you use apache as the primary service to keep your running container, you can NOT reboot it. Simply because you built the image and sets the CMD with it.

The main purpose of a CMD is to provide defaults for an executing container. These defaults can include an executable, or they can omit the executable, in which case you must specify an ENTRYPOINT instruction as well.

Try to reload without restart a service:

/etc/init.d/apache2 reload


回答2:

My solution to this was to exit my bash shell into the container, and just restart the container outside of Docker. Because Apache is set as the primary service, this also restarts Apache, and doesn't crash the container.

docker restart <container>


回答3:

I want to customize the container, I need to install some extension and for them to work I need to restart apache for the changes to take effect.

This is against the Docker's immutable infrastructure principle. IMHO, you are using the docker container similar to a full blown VM. Instead, I would suggest you to treat the docker image as the final artifact and version it. Note: This is just my humble opinion, you may have a valid usecase which I am not aware of, which I am curious to find out.



回答4:

sudo docker kill --signal="USR1" your_appache_container

Other signals that you can use to achieve the following :

Stop Now Signal: TERM

Graceful Restart Signal: USR1

Restart Now Signal: HUP

Graceful Stop Signal: WINCH

From: this website



回答5:

But before going, does your apache fails while doing the restart? Thats how it exits? In that case, please do make it run by setting right configurations and having a look at those logs.

One method you can try is login to the container (to bash) and you could always have a docker commit at a point where it works. You can then change your base container image to that.

I had workarounds for similar situations by building new images from these committed ones using different ENTRYPOINT's in my Dockefile.