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 "deepak@example.com"

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

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.


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,


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/


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 .

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


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.


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 -

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.