não é capaz de construir um Dockerfile específico

88

Eu sou capaz de construir um Dockerfile como

docker build -t deepak/ruby .

Mas para um Dockerfile que não é nomeado Dockerfile

# DOCKER-VERSION 0.4.8

FROM deepak/ruby

MAINTAINER Deepak Kannan "[email protected]"

RUN ./bin/rails s

vamos dizer que é chamado o Dockerfile.app qual construímos com

docker build -t deepak/app Dockerfile.app

então eu recebo o erro

Uploading context 0 bytes
Error build: EOF
EOF
Deepak
fonte
15
Portanto, sua pergunta é: como faço para construir um dockerfile se o nome do dockerfile não for Dockerfile?
Ken Cochrane
1
@KenCochrane sim. essa é a questão
deepak
1
Se você executar, docker build --helphá uma linha onde pode encontrar o que está procurando: -f, --file string Nome do Dockerfile (o padrão é 'PATH / Dockerfile')
blasrodri
2
Você estava aprendendo o Docker em 2013. Isso é previsão.
mcan

Respostas:

210

Observe que há um ponto .no final de ambos os comandos.

docker build -f MyDockerfile.

Ou com uma tag:

docker build -t mysuperimage -f MyDockerfile.

Andrzej Rehmann
fonte
1
docker build -f Dockerfile.consumerme dá um erro "docker build" requer exatamente 1 argumento. Veja 'docker build --help'. Uso: docker build [OPÇÕES] CAMINHO | URL | -
kamal
12
@kamal notou um ponto ( .) no final do comando acima?
Sateesh Pagolu
7
Apenas dizendo - exigindo adicionar o. é simplesmente irritante
myloginid
2
A .não é uma coisa necessária. O comando build leva dois args viz. caminho para o Dockerfile& caminho para o contextdiretório. Então, podemos fazerdocker build -t mysupertag -f ./foo/Dockerfile ./foo
Mohnish,
30

Isso funciona

docker build doronaviguy/helloworld -f SomeDockerFile .

Documentação de compilação do Docker

Doron Aviguy
fonte
2
Meu necessário -t para adicionar a tag.
musabaloyi
22

O último parâmetro para docker build é o caminho de construção, quando você coloca .isso significa que este é o caminho onde você encontrará o Dockerfile. Quando você mudar para, Dockerfile.appele tentará e procurará o Dockerfile.app/Dockerfileque não está correto.

Não tenho certeza se ainda funcionará, mas você costumava fazer isso.

$ docker build -t deepak/app - < Dockerfile.app

Tente isso e veja se ajuda, se não, talvez abra um problema do docker para adicionar esse recurso de volta ou atualize a documentação sobre como usar um Dockerfile com um nome diferente.

Mais informações aqui: http://docs.docker.io/en/latest/commandline/command/build/

Ken Cochrane
fonte
1
Eu tentei um url e funciona. O caminho também deve funcionar de acordo com os documentos. irá registrar um bug.
deepak
5
de acordo com os documentos que você compartilhou (obrigado). docker build - < Dockerfilenão me permite ADICIONAR um arquivo local. Mas tentei e funciona
deepak
2
mas eu quero dar um Dockerfile diferente e ainda ter um contexto, ou seja. Adicionar arquivos. então vou registrar um bug
deepak
Isso apenas criará um contexto com um único Dockerfile nele. Todos os arquivos de suporte não entrarão no contexto.
itsafire
12

Experimente o dockerfeed . Ele usa o recurso docker para construir um contexto via stdin. Eu escrevi o script para resolver exatamente o seu problema que eu mesmo estava enfrentando.

Para substituir um Dockerfile por um diferente, faça assim:

dockerfeed -d Dockerfile.app . | docker build -t deepak/ruby -

E voilà. Dockerfeed está fazendo o mesmo que docker build. Ele empacota o código-fonte com seu Dockerfile, mas permite que você troque o Dockerfile antigo pelo desejado. Nenhum arquivo é criado no processo, nenhuma fonte é alterada. O arquivo tar gerado é canalizado para o docker, que por sua vez o envia para o daemon do docker.

Atualização: Esta era uma resposta válida nos velhos tempos, quando não havia -fopção disponível. Com o docker versão 1.5, essa opção foi introduzida. Agora você pode fornecer um Dockerfile diferente como este:

docker build -f other-Dockerfile .
itsafire
fonte
5

Você também pode conseguir isso usando docker-compose.

Em docker-compose.yml na seção de compilação, você pode especificar o diretório no qual armazena seu dockerfile e seu nome alternativo da seguinte maneira:

build:
  context: "/path/to/docker/directory"
  dockerfile: "dockerfile-alternate-name"

docker-compose

eixo
fonte
0

Suponha que você tenha instalado com sucesso o docker toolbox incluindo docker-compose e docker-machine . Este é meu docker-compose.yml

version: '2'
services: 
  web: ./www/python
  ports:
   - "5000:5000"

E isso está no Dockerfile

FROM python:3.4-alpine
ADD ./www/python /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

Certifique-se de que esses arquivos estejam localizados precisamente na pasta raiz. Ao executar o docker-compose up, você criará uma imagem para a web.

Faris Rayhan
fonte
0

Meu caso está no /tmpdiretório e há muitos arquivos e o docker tente com outros arquivos embora eu passe o-f <Dockerfile.foo>

A solução mais limpa e fácil (para mim) é (em vez dockerfeeddas respostas acima):

cat DockerFile.debian.foo | docker build -t debian.foo -
tres.14159
fonte
0

O usuário do Windows deve tentar o comando abaixo:

docker build -f absolute_docker_file_path dot

por exemplo :

docker build -f D: \ Code \ core-api \ API_TEST.Dockerfile.

Nikhil Vats
fonte