Как в 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 шт):
Проблема в том, что при подключении тома, все директория с содержимым из образа, куда подключается том, замещается.
Чтобы обойти это нужно перенести создания файлов с этапа сборки образа на этап запуска, когда том уже подключен.
Для этого перед запуском существующей команды в 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