Daemian
Daemian

Reputation: 13

Persist Symfony upgrade in Docker container

I have a PHP-based Docker container with Composer and Symfony installed inside of it. But each time I start that container, a message from Symfony appears, proposing to download & install the last version (and to activate TLS), which I do (for both). So I think the upgrade doesn't persist, how can I solve this ? (thank you in advance)

Thank you for your answers, everyone. The docker-composer.yaml and php/Dockerfile are made from a French tutorial video, slightly modified due to improvements noted in the Youtube comment section: The video is called "Un environnement de développement Symfony 5 avec Docker et Docker-compose" from Yoandev Co. Here is the docker-compose.yaml :

version: "3.8"
services:

  db:
    image: mariadb
    container_name: db_SF_tuto_2
    restart: always
    volumes:
      - db-data2:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: admin
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    networks:
      - dev2

  phpmyadmin:
    image: phpmyadmin
    container_name: phpmyadmin_SF_tuto_2
    restart: always
    depends_on:
      - db
    ports:
      - 8090:80
    environment:
      PMA_HOST: db
    networks:
      - dev2

  maildev:
    image: maildev/maildev
    container_name: maildev_SF_tuto_2
    command: bin/maildev --web 80 --smtp 25 --hide-extensions STARTTLS
    ports:
      - "8091:80"
    restart: always
    networks:
      - dev2

  www:
    build: php
    container_name: www_SF_tuto_2
    ports:
      - "8742:8000"
    volumes:
      - ./php/vhosts:/etc/apache2/sites-enabled
      - ./:/var/www
    restart: always
    networks:
        - dev2

networks:
  dev2:

volumes:
  db-data2:

… and php/Dockerfile :

FROM php:7.4-apache

RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf \
\
    && apt-get update \
    && apt-get install -y --no-install-recommends \
       locales apt-utils git libicu-dev g++ libpng-dev libxml2-dev libzip-dev libonig-dev libxslt-dev unzip \
\
    && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \
    && echo "fr_FR.UTF-8 UTF-8" >> /etc/locale.gen \
    && locale-gen \
\
    && curl -sS https://getcomposer.org/installer | php -- \
    && mv composer.phar /usr/local/bin/composer \
\
    &&  curl -sS https://get.symfony.com/cli/installer | bash \
    &&  mv /root/.symfony/bin/symfony /usr/local/bin \
\
    && docker-php-ext-configure \
           intl \
    && docker-php-ext-install \
           pdo_mysql gd opcache intl zip calendar xsl \
\
    && pecl install apcu && docker-php-ext-enable apcu

WORKDIR /var/www/

Upvotes: 1

Views: 856

Answers (1)

msg
msg

Reputation: 8181

As you have discovered, container storage is temporary and any changes done in it will be discarded when the container is removed. Note that you can stop a running container and the changes will still be there the next time you launch it, but docker-compose down does remove it, so every time you boot up your symfony binary is being reloaded from the image.

If you want for the updates to persist you'll have to create a volume.

However, since your current installation directory already contains binaries from your base image I'd suggest installing to a different directory and mount that.

In your Dockerfile, change the installation target. Since its a new directory you need to add it to the current $PATH so the tools can be executed.

FROM php:7.4-apache

RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf \
\
    && apt-get update \
    && apt-get install -y --no-install-recommends \
       locales apt-utils git libicu-dev g++ libpng-dev libxml2-dev libzip-dev libonig-dev libxslt-dev unzip \
    && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \
    && echo "fr_FR.UTF-8 UTF-8" >> /etc/locale.gen \
    && locale-gen \
\
    && mkdir /opt/bin -p \
    && curl -sS https://getcomposer.org/installer | php -- --install-dir /opt/bin --filename composer \
    && curl -sS https://get.symfony.com/cli/installer | bash -s - --install-dir /opt/bin \
\
    && docker-php-ext-configure \
           intl \
    && docker-php-ext-install \
           pdo_mysql gd opcache intl zip calendar xsl \
\
    && pecl install apcu && docker-php-ext-enable apcu

ENV PATH /opt/bin:$PATH

WORKDIR /var/www/

Now specify where to map the volume in the docker-compose.yml file:

  www:
    # ...
    volumes:
      # Specify the mount point. 
      # If you use short syntax here, a volume will be created every restart.
      - phptools:/opt/bin

volumes:
  # Declare a named volume so it can be remounted
  phptools:

Run docker-compose build and docker-compose up.

Upvotes: 1

Related Questions