I am trying to build my own docker image for apache2 and PHP. Can anyone tell my why my container exits after run when it supposes to run ["apache2ctl", "-D", "FOREGROUND"]?
FROM ubuntu:latest
RUN apt update -y && apt upgrade -y
RUN apt install software-properties-common -y
RUN add-apt-repository ppa:ondrej/php -y
RUN apt update -y && apt upgrade -y
ARG DEBIAN_FRONTEND=noninteractive
RUN DEBIAN_FRONTEND=noninteractive apt install -y nano vim iputils-ping sudo git curl php php-cli php-fpm
RUN apt install -y php-json php-mysql
RUN apt install -y php-zip php-mbstring php-curl php-xml php-pear php-bcmath
RUN apt install psmisc -y
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOF_DIR /var/log/apache2
# RUN useradd -ms /bin/bash devwl
EXPOSE 80/tcp
ENTRYPOINT ["/bin/sh", "-c"]
CMD ["apache2ctl", "-D", "FOREGROUND"]
Build command:
docker build -t www .
Run command:
docker run -itd -p 80:80 www
CodePudding user response:
Just tried to build your Dockerfile. docker logs
shows a problem with start command. Running container without -D
option works well...
CMD ["apache2ctl", "start"]
Do you need to use <IfDefine ...> in conf files?
CodePudding user response:
You need to delete the ENTRYPOINT
line.
Since you have both an ENTRYPOINT
and a CMD
, they get combined together into a single argument list. That means you have an effective command like
ENTRYPOINT CMD ["/bin/sh", "-c", "apache2ctl", "-D", "FOREGROUND"]
But sh -c
only reads in the single next argument and executes it. The remaining arguments would be accessible inside that string as positional parameters $0
, $1
, ... but unless you refer to one of those then the command you're eventually running is only apachectl
with no arguments.
You only need to invoke a shell at all if your command uses shell features (referencing environment variables or running multiple commands). Yours doesn't, so you don't need anything that mentions a shell; just delete the ENTRYPOINT
and have the existing CMD
start Apache.
In a Dockerfile, you shouldn't usually need to say sh -c
at all. If you do need to invoke a shell to run some command, you can use Docker shell syntax as a plain string without the JSON-array syntax; for example
# needs a shell because of $VARIABLE and command; command syntax
CMD touch "$APACHE_LOG_DIR/started"; exec apache2ctl -DFOREGROUND
(If you do need to override this command with docker run
arguments or in a Compose command:
, these syntaxes will not automatically insert a shell wrapper and there you do need to specifically say sh -c 'some command'
if you need a shell to process the command string; again note the single quotes to make the command string a single argument.)