Невозможно выполнить RUN mkdir в Dockerfile

118

Это сообщение об ошибке, которое я получаю при создании образа 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звучит так бессмысленно - такого каталога конечно нет. Я хочу создать это. Что здесь не так?

luqo33
источник
4
Между прочим, здесь нет ничего специфичного для Docker - у вас была бы такая же проблема, работающая mkdir /var/www/appв системе, у которой /var/wwwбез него не было бы.
Чарльз Даффи,

Ответы:

179

Проблема в том, что он /var/wwwтоже не существует и mkdirпо умолчанию не рекурсивен - он ожидает, что непосредственный родительский каталог существует.

Использование:

mkdir -p /var/www/app

... или установите пакет, который создает /var/wwwдо достижения этой точки в вашем Dockerfile.

Чарльз Даффи
источник
Спасибо за указание на это. Кстати, какой пакет вы хотите создать /var/www?
luqo33 09
Это вопрос об упаковке Ubuntu 14.04; Я в этом не специалист.
Чарльз Даффи,
60

При создании подкаталогов, висящих от несуществующих родительских каталогов, вы должны передать -pфлаг mkdir... Пожалуйста, обновите свой Dockerfile с помощью

RUN mkdir -p ... 

Я проверил это, и это правильно.

Костикас
источник
17

Вы также можете просто использовать

WORKDIR /var/www/app

Он автоматически создаст папки, если они не существуют.

Затем вернитесь в каталог, в котором хотите находиться.

Helzgate
источник
-1

Помимо предыдущих вариантов использования, вы также можете использовать Docker Compose для создания каталогов на случай, если вы хотите создать новые фиктивные папки docker-compose up:

    volumes:
  - .:/ftp/
  - /ftp/node_modules
  - /ftp/files
Джасмит Сингх Чхабра
источник
Что с этим ответом? Хельцгейт тоже опоздал.
Питер Мортенсен,