Docker: não é possível executar RUN mkdir em um Dockerfile

116

Esta é uma mensagem de erro que recebo ao construir uma imagem Docker:

Etapa 18: EXECUTE mkdir / var / www / app && chown luqo33: www-data / var / www / app ---> Executando em 7b5854406120 mkdir: não é possível criar o diretório '/ var / www / app': Não existe esse arquivo ou diretório

Este é um fragmento do Dockerfile que causa o erro:

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: não é possível criar o diretório '/ var / www / app': Nenhum arquivo ou diretório" soa tão sem sentido - é claro que esse diretório não existe. Eu quero criar isso. O que há de errado aqui?

luqo33
fonte
4
Nada específico do Docker aqui, aliás - você teria o mesmo problema ao rodar mkdir /var/www/appem um sistema que não tivesse um /var/wwwsem ele.
Charles Duffy

Respostas:

178

O problema é que /var/wwwtambém não existe e mkdirnão é recursivo por padrão - ele espera que o diretório pai imediato exista.

Usar:

mkdir -p /var/www/app

... ou instale um pacote que cria um /var/wwwantes de chegar a este ponto em seu Dockerfile.

Charles Duffy
fonte
Obrigado por apontar isso. A propósito, qual pacote você quer dizer que criaria /var/www?
luqo33
Essa é uma pergunta sobre o pacote do Ubuntu 14.04; Eu não sou um especialista nisso.
Charles Duffy
60

Ao criar subdiretórios pendurados em um diretório pai não existente, você deve passar a -psinalização para mkdir... Atualize seu Dockerfile com

RUN mkdir -p ... 

Eu testei isso e está correto.

Kostikas
fonte
17

Você também pode simplesmente usar

WORKDIR /var/www/app

Ele criará automaticamente as pastas se elas não existirem.

Em seguida, volte para o diretório em que você precisa estar.

Helzgate
fonte
-1

Além dos casos de uso anteriores, você também pode usar o Docker Compose para criar diretórios, caso queira criar novas pastas fictícias em docker-compose up:

    volumes:
  - .:/ftp/
  - /ftp/node_modules
  - /ftp/files
Jasmeet Singh Chhabra
fonte
Qual é o problema com esta resposta? Helzgate também estava atrasado.
Peter Mortensen