Docker build在mkdir上失败



我使用 Dockerfile 创建一个 apache2 ubuntu 镜像。当它必须创建目录时,它失败了,说其中一些目录已经存在,但实际上根本不存在。 Dockerfile :

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导致了这个问题,但它以某种方式过去了,现在/var/log/apache2不会被创建。

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

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

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

当您检查目录是否存在时,您可能正在访问从另一个映像启动的容器,而不是您尝试使用此 docker 构建的映像。

为了保护这一点,请在RUN mkdir末尾添加exit 0,或更改一个 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

相关内容

最新更新