skip to Main Content

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

Ouput docker ps:
enter image description here

2

Answers


  1. 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?

    Login or Signup to reply.
  2. 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.)

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search