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
2
Answers
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?
You need to delete the
ENTRYPOINT
line.Since you have both an
ENTRYPOINT
and aCMD
, they get combined together into a single argument list. That means you have an effective command likeBut
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 onlyapachectl
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 existingCMD
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(If you do need to override this command with
docker run
arguments or in a Composecommand:
, these syntaxes will not automatically insert a shell wrapper and there you do need to specifically saysh -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.)