Docker Build:mkdir创build文件夹,但在运行时消失

我试图用以下的Dockerfile扩展一个apache2 docker容器:

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并login到正在运行的容器中:

 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 .. 

创build的dirs会随机消失,有时启用了/ data / apache / conf-conf目录。 有人可以帮我吗? 提前致谢。

编辑:

 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 

没有足够的数据可以肯定地回答这个问题,但最大的提示来自于你将这些定义为卷:

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

我怀疑你的撰写命令是从以前的运行拉这些文件夹。 如果你在外部群体上运行,这些卷可能会有所不同,这取决于群体运行你的容器的节点。 要知道,我们需要查看你docker-compose.yml ,了解更多关于你运行这些命令的环境,以及你正在运行的所有docker-compose命令( stopdown不同) 。

请注意,我不build议将卷创build为Dockerfile的一部分,因为它限制了构build于其上的所有映像都无法修改这些文件夹(它们所做的任何更改通常会丢失),并且在您不使用时创build匿名容器卷没有定义你写作的音量位置。 这些匿名容器卷需要使用remove( docker rm -v )上的额外标志进行清理,或者在每个唯一标识上使用docker volume rm手动清理。


回答编辑的问题:用这个组装的卷挂载,它取决于/ mnt / docker / test / apache中的内容,容器中的目录内容将被主机挂载的内容完全覆盖。 如果您的容器运行在不同的主机上(例如群集),则每个主机在此位置可能具有不同的内容。 如果目录不存在,那将导致容器中的空目录。