How to fix missing php extensions problems in custom Docker image? There are many excellent questions here about automating the initial setup process for Drupal but I haven't seen any pertaining specifically to Drupal containers in Docker.

Here's my setup. I've kept the images/builds as vanilla as possible; the only Dockerfile I have is for composer, inspired by the accepted answer to this question.

docker-compose.yml

version: '2'
services:

  drupal:
    image: drupal
    ports:
      - 8888:80

  mariadb:
    image: mariadb
    environment:
       MYSQL_DATABASE: drupal8
       MYSQL_USER: drupal8
       MYSQL_PASSWORD: drupal8
       MYSQL_ROOT_PASSWORD: drupal8
    restart: always
    depends_on:
      - drupal

  drush:
    image: drush/drush

  composer:
    image: composer
    build: composer_init
    depends_on:
      - drupal
      - drush


Dockerfile for composer:

FROM composer

RUN composer -vvv create-project drupal-composer/drupal-project /var/www/html --stability dev --no-interaction
RUN cd /var/www/html
RUN drush si -y \
  --db-url=mysql://root:drupal8@localhost/drupal8 \
  --site-name=drupal8 \
  --site-mail=drupal8@foo.com \
  --account-mail=drupal8@foo.com \
  --account-name=drupal8 \
  --account-pass=drupal8 &gt;&gt; /dev/null 2&gt;&amp;1


I spun up the build process by issuing docker-compose up -d --build.
Now when the process reached the composer part, it blew up with the following message:

Resolving dependencies through SAT
Dependency resolution completed in 0.001 seconds
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - drupal/core 8.5.x-dev requires ext-gd * -&gt; the requested PHP extension gd is missing from your system.
    - drupal/core 8.5.1 requires ext-gd * -&gt; the requested PHP extension gd is missing from your system.
    - Installation request for drupal/core ~8.5.1 -&gt; satisfiable by drupal/core[8.5.1, 8.5.x-dev].

  To enable extensions, verify that they are enabled in your .ini files:
    - 
    - /usr/local/etc/php/conf.d/date_timezone.ini
    - /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
    - /usr/local/etc/php/conf.d/docker-php-ext-zip.ini
    - /usr/local/etc/php/conf.d/memory-limit.ini
  You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.


Based on other answers/suggestions here, I added a Dockerfile to my drupal section and added RUN apt-get install php7.0-gd to the Dockerfile, but this now blows up with E: Package 'php7.0-gd' has no installation candidate.

I've ensured that the PHP version for this Docker image is PHP 7.

php --ini gives me:

# php --ini
Configuration File (php.ini) Path: /usr/local/etc/php
Loaded Configuration File:         (none)
Scan for additional .ini files in: /usr/local/etc/php/conf.d
Additional .ini files parsed:      /usr/local/etc/php/conf.d/docker-php-ext-gd.ini,
/usr/local/etc/php/conf.d/docker-php-ext-opcache.ini,
/usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini,
/usr/local/etc/php/conf.d/docker-php-ext-pdo_pgsql.ini,
/usr/local/etc/php/conf.d/docker-php-ext-zip.ini,
/usr/local/etc/php/conf.d/opcache-recommended.ini


How can I resolve this error now?
I resolved this by removing the drush and composer services from the docker-compose file and updating my Dockerfile for drupal as follows:

FROM drupal


RUN apt-get update -y &amp;&amp; apt-get install -y wget vim git mysql-client

RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" &amp;&amp; \
    php composer-setup.php &amp;&amp; \
    mv composer.phar /usr/local/bin/composer &amp;&amp; \
    php -r "unlink('composer-setup.php');"

RUN wget -O drush.phar https://github.com/drush-ops/drush-launcher/releases/download/0.4.2/drush.phar &amp;&amp; \
    chmod +x drush.phar &amp;&amp; \
    mv drush.phar /usr/local/bin/drush