无法在 Dockerfile 中执行 RUN mkdir

这是我在构建 Docker 映像时得到的一个错误消息:

Step 18 : RUN mkdir /var/www/app && chown luqo33:www-data /var/www/app
---> Running in 7b5854406120 mkdir: cannot create directory '/var/www/app': No such file or directory

这是导致这一错误的 Dockerfile 碎片:

FROM ubuntu:14.04
RUN groupadd -r luqo33 && useradd -r -g luqo33 luqo33


<installing nginx, fpm, php and a couple of other things>


RUN mkdir /var/www/app && chown luqo33:www-data /var/www/app
VOLUME /var/www/app
WORKDIR /var/www/app

mkdir: cannot create directory '/var/www/app': No such file or directory听起来如此荒谬——当然没有这样的目录。我想创造它。怎么了?

285633 次浏览

问题是 /var/www也不存在,而且 mkdir在默认情况下不是递归的——它期望直接的父目录存在。

用途:

mkdir -p /var/www/app

... 或者在到达 Dockerfile 的这个点之前安装一个创建 /var/www的包。

当创建挂起在不存在的父目录上的子目录时,必须将 -p标志传递给 mkdir... 请使用

RUN mkdir -p ...

我测试过了,是正确的。

您也可以简单地使用

WORKDIR /var/www/app

如果文件夹不存在,它将自动创建这些文件夹。

然后切换回您需要进入的目录。

除了以前的用例,您还可以使用 Docker Compose来创建目录,以防您想在 docker-compose up上创建新的虚拟文件夹:

    volumes:
- .:/ftp/
- /ftp/node_modules
- /ftp/files

此外,如果您想使用多个目录,然后它们的更改所有者,您可以使用:

RUN set -ex && bash -c 'mkdir -p /var/www/{app1,app2}' && bash -c 'chown luqo33:www-data /var/www/{app1,app2}'

只有这个!