Как в Dockerfile создать папку с содержимым для последующего подключения тома?

Создаю папку внутри контейнера и пустой файл в ней, заготовленный для логов. Даю ему chmod 666, затем подключаю к этой папке том, и файл пропадает.

Фрагмент Dockerfile:

FROM php:8.0-fpm

RUN mkdir -p /usr/local/php-logs && \
touch /usr/local/php-logs/php-fpm.log && \
chmod 666 /usr/local/php-logs/php-fpm.log

Фрагмент docker-compose:

version: '3'
services:
  #PHP
  php:
    build:
      context: ./image/php8.0/.
    image: analytics/php:8.0
    container_name: analytics-php8.0
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: analytics
      SERVICE_TAGS: prod
    working_dir: /var/www
    volumes:
      - ./app:/var/www
      - ./logs:/usr/local/php-logs
  #Nginx Service
  webserver:
    build:
      context: ./image/nginx/.
    image: analytics/nginx
    container_name: analytics-ngnx
    restart: unless-stopped
    tty: true
    ports:
      - "${HTTP_PORT}:80"
      - "${HTTP_SECURE_PORT}:443"
    volumes:
      - ./app:/var/www
      - ./logs:/var/log/nginx

Как сделать это правильно, чтобы заготовленный файл не пропадал?


Ответы (1 шт):

Автор решения: Roman Konoval

Проблема в том, что при подключении тома, все директория с содержимым из образа, куда подключается том, замещается.

Чтобы обойти это нужно перенести создания файлов с этапа сборки образа на этап запуска, когда том уже подключен.

Для этого перед запуском существующей команды в Dockerfile:

CMD php /pah/to/your-script.php

Добавьте еще и создание файла:

CMD mkdir -p /usr/local/php-logs && \
  touch /usr/local/php-logs/php-fpm.log && \
  chmod 666 /usr/local/php-logs/php-fpm.log && \
  php /pah/to/your-script.php

Для удобства, перенесите это все в отдельный shell скрипт и уже его запускайте в CMD. Для этого рядом с Dockerfile создайте файл run.sh:

#!/bin/sh

mkdir -p /usr/local/php-logs
touch /usr/local/php-logs/php-fpm.log
chmod 666 /usr/local/php-logs/php-fpm.log

php /path/to/your-script.php

В Dockerfile добавьте его в образ и используйте его в CMD:

...
ADD run.sh /run.sh

CMD /bin/sh -c /run.sh
→ Ссылка