Docker构建在mkdir上失败

时间:2018-06-13 07:19:43

标签: image ubuntu docker apache2

我使用Dockerfile创建一个apache2 ubuntu镜像。当它有必要创建目录时,它会失败,说某些目录已经存在,但事实上根本不存在。 Dockerfile:

package.json

执行FROM ubuntu:latest MAINTAINER Bernard Tapis RUN apt-get -yqq update && apt-get install -yqq apache2 WORKDIR /var/www/html ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 ENV APACHE_PID_FILE /var/run/apache2.pid ENV APACHE_RUN_DIR /var/run/apache2 ENV APACHE_LOCK_DIR /var/lock/apache2 RUN mkdir p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR ENTRYPOINT ["/usr/sbin/apache2"] CMD ["-D", "FOREGROUND"] EXPOSE 80

时出错
docker image build -t quentinneves/apache .

但是当我使用Step 11/14 : RUN mkdir p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR ---> Running in 1d72a8fd64c0 mkdir: cannot create directory '/var/log/apache2': File exists The command '/bin/sh -c mkdir p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR' returned a non-zero code: 1 时:

ls -lsa /var/log/

惊喜不在那里!在此之前,导致此问题的是root@VIR1-DOCKER:~/Docker/Apache# ls -lsa /var/log/ total 1576 4 drwxr-xr-x 5 root root 4096 Jun 1 13:42 . 4 drwxr-xr-x 11 root root 4096 Jun 1 13:35 .. 16 -rw-r--r-- 1 root root 13515 Jun 13 07:33 alternatives.log 4 drwxr-xr-x 2 root root 4096 Jun 13 07:33 apt 12 -rw-r----- 1 root adm 8773 Jun 6 15:17 auth.log 4 -rw------- 1 root utmp 768 Jun 6 07:06 btmp 76 -rw-r----- 1 root adm 70771 Jun 13 08:05 daemon.log 108 -rw-r----- 1 root adm 107936 Jun 6 07:05 debug 268 -rw-r--r-- 1 root root 269141 Jun 13 07:33 dpkg.log 8 -rw-r--r-- 1 root root 32032 Jun 6 07:05 faillog 4 drwxr-xr-x 3 root root 4096 Jun 1 13:39 installer 356 -rw-r----- 1 root adm 363005 Jun 13 08:05 kern.log 12 -rw-rw-r-- 1 root utmp 292292 Jun 6 15:09 lastlog 252 -rw-r----- 1 root adm 255033 Jun 13 08:05 messages 428 -rw-r----- 1 root adm 435499 Jun 13 08:05 syslog 4 drwxr-x--- 2 root adm 4096 Jun 6 07:01 unattended-upgrades 16 -rw-rw-r-- 1 root utmp 15744 Jun 6 15:10 wtmp ,但它以某种方式过去了,现在/var/lock/apache2刚刚被创建。

如果我删除此文件夹创建并手动创建它,它是否适用于为docker创建新图像?而且你知道它为什么认为已经有这样的文件夹了吗?

1 个答案:

答案 0 :(得分:2)

你的问题是你创建了目录而没有防止它们已经存在。

您已经定义了APACHE_LOG_DIR = APACHE_RUN_DIR,因此,您的RUN mkdir p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR命令会尝试创建两次并失败。

当您检查目录是否存在时,可能您正在访问从另一个图像开始的容器,该容器与您尝试使用此docker构建的图像不同。

为了保护它,在exit 0的末尾添加RUN mkdir,或更改一个ENV:

ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2   <--- the same than APACHE_LOG_DIR
ENV APACHE_LOCK_DIR /var/lock/apache2
RUN mkdir p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR; exit 0