【问题标题】:Docker build: mkdir creates folders, but they disappear in runtimeDocker 构建:mkdir 创建文件夹,但它们在运行时消失
【发布时间】:2017-01-11 08:23:59
【问题描述】:

我正在尝试使用以下 Dockerfile 扩展 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

【问题讨论】:

  • BTW:目录创建成功:Step 6 : RUN bash -c 'mkdir -pv /data/{apache/conf-enabled,php/conf.d}' ---> Running in 77a80dc8b5d3 mkdir: created directory '/data' mkdir: created directory '/data/apache' mkdir: created directory '/data/apache/conf-enabled' mkdir: created directory '/data/php' mkdir: created directory '/data/php/conf.d'

标签: docker docker-compose docker-build


【解决方案1】:

没有足够的数据来肯定地回答这个问题,但最大的暗示来自您将这些定义为卷的事实:

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

我怀疑您的 compose 命令正在从以前的运行中提取这些文件夹。如果您在外部 swarm 上运行,这些卷可能会有所不同,具体取决于 swarm 在哪个节点上运行您的容器。要确定,我们需要查看您的docker-compose.yml,了解更多关于您运行这些命令的环境,以及您正在运行的所有docker-compose 命令(stop 与@987654325 非常不同@)。

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


回复已编辑的问题:使用该组合卷挂载,它取决于 /mnt/docker/test/apache 中的内容,容器内目录的内容将被从主机挂载的任何内容完全覆盖。如果您的容器在不同的主机(例如 swarm)上运行,则每个主机在此位置可能有不同的内容。如果目录丢失,则会导致容器中的目录为空。

【讨论】:

  • @unrl 我已经根据您的撰写文件更新了我的答案,并提供了更多详细信息。
  • 谢谢,我必须将/data/apache/*/data/php/* 中的每个文件夹指定为卷才能访问它们中的每一个。它有效,但我不知道为什么。
猜你喜欢
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多