Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I keep a PHP-CLI container running without the need of any PHP script?

I have been trying to build a PHP cli container using Docker & Docker Compose and I want to keep it alive without the need to have any PHP script running inside it.

I have tried my own Dockerfile:

FROM ubuntu:16.04
ENV PATH="/root/.composer/vendor/bin:${PATH}"

RUN apt-get update && \
    apt-get -y -qq install software-properties-common \
    xvfb \
    locales && \
    locale-gen en_US.UTF-8 && \
    export LC_ALL=en_US.UTF-8 && \
    export LANG=en_US.UTF-8 && \
    add-apt-repository ppa:ondrej/php && \
    apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get -y --allow-unauthenticated install \
    php7.1-curl \
    php7.1-cli \
    php7.1-bcmath \
    php7.1-json \
    php7.1-intl \
    php7.1-mbstring \
    php7.1-mcrypt \
    php7.1-mysql \
    php7.1-xml \
    php7.1-xsl \
    php7.1-zip \
    curl \
    git \
    wget \
    pkg-config && \
    apt-get clean && \
    apt-get autoremove && \
    rm -rf /var/lib/apt/lists/*

COPY config /
RUN sh /usr/local/bin/install.sh
ENTRYPOINT bash -C '/entrypoint.sh';'bash'
CMD ["php", "-a"]

And this one other too (extending from main PHP images):

FROM php:7-cli-alpine
ENV PATH="/root/.composer/vendor/bin:${PATH}"
COPY config /
RUN sh /usr/local/bin/install.sh
WORKDIR /var/wwww
CMD ["php", "-a"]

The docker-compose.yml has nothing but this:

version: '3.3'
services:
    webserver:
      build:
        context: .
      restart: on-failure
      env_file: .env
      environment:
          UID: ${UID}
          GID: ${GID}

Finally here is the full repository with everything if you want to give it a try.

What is the problem? After build the container by running docker-compose up --build --force-recreate it exit out with code 0 but docker-composer logs is not helpful either because it says nothing.

Take a look to the following output from the command line (for the 2nd Dockerfile on this post, for the first one is pretty much the same with more things):

$ docker-compose up --build --force-recreate
Building webserver
Step 1/6 : FROM php:7-cli-alpine
7-cli-alpine: Pulling from library/php
90f4dba627d6: Pull complete
623a0217e4bc: Pull complete
ecbf507e7e3c: Pull complete
79a82dee0025: Pull complete
457716c6bb05: Pull complete
62e36287ffd0: Pull complete
507e98c003bc: Pull complete
b25e699baa37: Pull complete
Digest: sha256:ecae911bd22279d4883ffdc631afddc434641c67eedf49914fc62dafb5329663
Status: Downloaded newer image for php:7-cli-alpine
 ---> 1e563ea5f552
Step 2/6 : ENV PATH "/root/.composer/vendor/bin:${PATH}"
 ---> Running in 29b65c1d7def
 ---> d11c62bb5cf5
Removing intermediate container 29b65c1d7def
Step 3/6 : COPY config /
 ---> e42022d1de91
Step 4/6 : RUN sh /usr/local/bin/install.sh
 ---> Running in 749230f42e9e
All settings correct for using Composer
Downloading...

Composer (version 1.5.2) successfully installed to: /usr/local/bin/composer
Use it: php /usr/local/bin/composer

Changed current directory to /root/.composer
Loading composer repositories with package information
Updating dependencies
Package operations: 21 installs, 0 updates, 0 removals
  - Installing hirak/prestissimo (0.3.7): Downloading (100%)
  - Installing symfony/stopwatch (v3.3.10): Downloading (100%)
  - Installing symfony/process (v3.3.10): Downloading (100%)
  - Installing symfony/polyfill-php72 (v1.5.0): Downloading (100%)
  - Installing paragonie/random_compat (v2.0.11): Downloading (100%)
  - Installing symfony/polyfill-php70 (v1.5.0): Downloading (100%)
  - Installing symfony/options-resolver (v3.3.10): Downloading (100%)
  - Installing symfony/finder (v3.3.10): Downloading (100%)
  - Installing symfony/filesystem (v3.3.10): Downloading (100%)
  - Installing symfony/event-dispatcher (v3.3.10): Downloading (100%)
  - Installing psr/log (1.0.2): Downloading (100%)
  - Installing symfony/debug (v3.3.10): Downloading (100%)
  - Installing symfony/polyfill-mbstring (v1.5.0): Downloading (100%)
  - Installing symfony/console (v3.3.10): Downloading (100%)
  - Installing php-cs-fixer/diff (v1.1.0): Downloading (100%)
  - Installing gecko-packages/gecko-php-unit (v2.2): Downloading (100%)
  - Installing doctrine/lexer (v1.0.1): Downloading (100%)
  - Installing doctrine/annotations (v1.5.0): Downloading (100%)
  - Installing composer/semver (1.4.2): Downloading (100%)
  - Installing friendsofphp/php-cs-fixer (v2.7.1): Downloading (100%)
  - Installing squizlabs/php_codesniffer (3.1.0): Downloading (100%)
Writing lock file
Generating optimized autoload files
Cache directory does not exist (cache-vcs-dir): 
Clearing cache (cache-repo-dir): /root/.composer/cache/repo
Clearing cache (cache-files-dir): /root/.composer/cache/files
Clearing cache (cache-dir): /root/.composer/cache
All caches cleared.
 ---> ff310362f4a5
Removing intermediate container 749230f42e9e
Step 5/6 : WORKDIR /var/wwww
 ---> fe10fd52d6b6
Removing intermediate container 6e472a693c0c
Step 6/6 : CMD php -a
 ---> Running in 789688d1346a
 ---> b1286e96580b
Removing intermediate container 789688d1346a

Successfully built b1286e96580b
Successfully tagged dockerlamp_webserver:latest
Recreating dockerlamp_webserver_1 ... 
Recreating dockerlamp_webserver_1 ... done
Attaching to dockerlamp_webserver_1
webserver_1  | Interactive shell
webserver_1  | 
dockerlamp_webserver_1 exited with code 0

$ docker-compose logs
Attaching to dockerlamp_webserver_1
webserver_1  | Interactive shell
webserver_1  | 

How I can keep the container running without the need to run a PHP script?

Note: you might be asking why not just build php-fpm|apache but the thing is I do not need any webserver because the container will be used for a command line project only (which is a WIP)

like image 977
ReynierPM Avatar asked Oct 13 '17 17:10

ReynierPM


1 Answers

You are running php -a which is a REPL and it needs interactive TTY. So you need to enable those in your compose

version: '3.3'
services:
    webserver:
      build:
        context: .
      restart: on-failure
      env_file: .env
      environment:
          UID: ${UID}
          GID: ${GID}
      tty: true
      stdin_open: true

Later if you need to attach to it to run commands you will need to use docker

docker attach <containernameOrID>
like image 117
Tarun Lalwani Avatar answered Oct 02 '22 16:10

Tarun Lalwani