Docker Build: mkdir создает папки, но они исчезают во время выполнения

Я пытаюсь расширить докер-контейнер apache2 следующим Dockerfile:

FROM joomla:3-apache-php7    
RUN apt-get update
RUN a2enmod ssl

RUN printf "\nIncludeOptional /data/apache/conf-enabled/*.conf\n" >> /etc/apache2/apache2.conf
RUN printf "include_path = '.:/data/php/conf.d'" > /usr/local/etc/php/conf.d/additional.ini

RUN bash -c 'mkdir -pv /data/{apache/conf-enabled,php/conf.d}'
RUN ln -s /etc/apache2/sites-enabled/ /data/apache/sites-enabled

VOLUME ["/var/www/html/", "/data/apache/", "/data/php/"]

EXPOSE 80 443

ENTRYPOINT ["/entrypoint.sh"]
CMD ["apache2-foreground"]

Когда я пытаюсь запустить контейнер, это появляется:

root@n06 / # docker-compose up -d
root@n06 / # docker-compose logs container
apache2: Syntax error on line 223 of /etc/apache2/apache2.conf: Could not open config directory /data/apache/conf-enabled: No such file or directory

Когда я закомментирую RUN printf "\nIncludeOptional /data/apache/conf-enabled/*.conf\n" >> /etc/apache2/apache2.conf и войдите в работающий контейнер:

root@1c72507b2024:/# ls -la /data/**
/data/apache:
total 8
drwxr-xr-x 2 root root 4096 Sep  3 11:39 .
drwxr-xr-x 5 root root 4096 Sep  3 11:50 ..

/data/php:
total 8
drwxr-xr-x 2 root root 4096 Sep  3 11:39 .
drwxr-xr-x 5 root root 4096 Sep  3 11:50 ..

Созданные каталоги исчезают случайно, иногда там находится каталог /data/apache/conf-enabled. Кто-нибудь может мне помочь? Заранее спасибо.

РЕДАКТИРОВАТЬ:

docker-compose.yml:

version: '2'

networks:
  main:
    driver: bridge
    ipam:
       driver: default
       config:
         - subnet: 172.18.0.0/16
           gateway: 172.18.0.1

services:
  test:
    build: docker/test
    container_name: test
    networks:
      - main
    volumes:
      - /mnt/docker/test/joomla:/var/www/html
      - /mnt/docker/test/apache:/data/apache/
      - /mnt/docker/test/php:/data/php/
      - /etc/letsencrypt:/etc/letsencrypt
      - /var/lib/letsencrypt:/var/lib/letsencrypt
      - /etc/localtime:/etc/localtime
    links:
      - mariadb:mariadb
    environment:
      - JOOMLA_DB_USER=test
      - JOOMLA_DB_PASSWORD=test
      - JOOMLA_DB_HOST=mariadb
      - JOOMLA_DB_NAME=test

1 ответ

Решение

На самом деле данных недостаточно, чтобы с уверенностью ответить на этот вопрос, но самая большая подсказка проистекает из того факта, что вы определяете их как объемы:

VOLUME ["/var/www/html/", "/data/apache/", "/data/php/"]

Я подозреваю, что ваша команда compose извлекает эти папки из предыдущих запусков. И если вы работаете с внешним роем, эти тома могут отличаться в зависимости от того, на каком узле роем работает ваш контейнер. Чтобы знать наверняка, нам нужно увидеть ваш docker-compose.ymlузнать больше о среде, в которой вы запускаете эти команды, и обо всех docker-compose команды, которые вы выполняете (stop сильно отличается от down).

Обратите внимание, что я не рекомендую создавать том как часть вашего Dockerfile, поскольку он ограничивает любые изображения, созданные на его основе, возможностью изменять эти папки (любые изменения, которые они вносят, обычно теряются), а также создает анонимные тома контейнера, когда вы не надеваете не определить местоположение объема в вашем сочинении. Эти анонимные тома контейнера должны быть очищены с помощью дополнительного флага при удалении (docker rm -v) или вручную с docker volume rm на каждый уникальный идентификатор.


Отвечая на отредактированный вопрос: при монтировании тома compose зависит от того, что находится в /mnt/docker/test/apache, содержимое каталога внутри контейнера будет полностью перезаписано тем, что смонтировано с хоста. Если ваш контейнер работает на другом хосте (например, swarm), у каждого хоста может быть разное содержимое в этом месте. Если каталог отсутствует, это приведет к пустой директории в контейнере.

Другие вопросы по тегам