Docker build: mkdir 创建文件夹,但它们在运行时消失
Docker build: mkdir creates folders, but they disappear in runtime
我正在尝试使用以下 Docker 文件扩展 Apache 2 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
并登录到 运行 容器时:
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
确实没有足够的数据可以肯定地回答这个问题,但最大的提示来自于您将这些定义为卷:
VOLUME ["/var/www/html/", "/data/apache/", "/data/php/"]
我怀疑您的撰写命令从以前的运行中提取了这些文件夹。如果您 运行 在外部 swarm 上,这些卷可能会有所不同,具体取决于 swarm 在哪个节点上运行您的容器。要确定地知道,我们需要查看您的 docker-compose.yml
,更多地了解您使用 运行 这些命令的环境,以及您使用的所有 docker-compose
命令 运行(stop
与 down
非常不同)。
请注意,我不建议创建卷作为 Dockerfile 的一部分,因为它会限制在此基础上构建的任何图像修改这些文件夹(它们所做的任何更改通常会丢失),并且它会创建匿名当您未在撰写中定义卷位置时的容器卷。这些匿名容器卷需要在删除时使用额外的标志 (docker rm -v
) 进行清理,或者在每个唯一 ID 上使用 docker volume rm
手动进行清理。
回答编辑后的问题:使用组合卷安装,这取决于 /mnt/docker/test/apache 中的内容,容器内目录的内容将被从主机安装的任何内容完全覆盖。如果你的容器 运行 在不同的主机上(例如 swarm),每个主机在这个位置可能有不同的内容。如果该目录丢失,将导致容器中的目录为空。
我正在尝试使用以下 Docker 文件扩展 Apache 2 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
并登录到 运行 容器时:
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
确实没有足够的数据可以肯定地回答这个问题,但最大的提示来自于您将这些定义为卷:
VOLUME ["/var/www/html/", "/data/apache/", "/data/php/"]
我怀疑您的撰写命令从以前的运行中提取了这些文件夹。如果您 运行 在外部 swarm 上,这些卷可能会有所不同,具体取决于 swarm 在哪个节点上运行您的容器。要确定地知道,我们需要查看您的 docker-compose.yml
,更多地了解您使用 运行 这些命令的环境,以及您使用的所有 docker-compose
命令 运行(stop
与 down
非常不同)。
请注意,我不建议创建卷作为 Dockerfile 的一部分,因为它会限制在此基础上构建的任何图像修改这些文件夹(它们所做的任何更改通常会丢失),并且它会创建匿名当您未在撰写中定义卷位置时的容器卷。这些匿名容器卷需要在删除时使用额外的标志 (docker rm -v
) 进行清理,或者在每个唯一 ID 上使用 docker volume rm
手动进行清理。
回答编辑后的问题:使用组合卷安装,这取决于 /mnt/docker/test/apache 中的内容,容器内目录的内容将被从主机安装的任何内容完全覆盖。如果你的容器 运行 在不同的主机上(例如 swarm),每个主机在这个位置可能有不同的内容。如果该目录丢失,将导致容器中的目录为空。