nie można zbudować określonego pliku Dockerfile

88

Jestem w stanie zbudować plik Dockerfile jak

docker build -t deepak/ruby .

Ale dla pliku Dockerfile, który nie jest nazwany Dockerfile

# DOCKER-VERSION 0.4.8

FROM deepak/ruby

MAINTAINER Deepak Kannan "[email protected]"

RUN ./bin/rails s

powiedzmy, że nazywa się to, z Dockerfile.app którym budujemy

docker build -t deepak/app Dockerfile.app

wtedy pojawia się błąd

Uploading context 0 bytes
Error build: EOF
EOF
deepak
źródło
15
Więc twoje pytanie brzmi: jak zbudować plik dockerfile, jeśli nazwa pliku dockerfile nie jest dockerfile?
Ken Cochrane,
1
@KenCochrane yes.
oto
1
Jeśli uruchomisz docker build --help, jest linia, w której możesz znaleźć to, czego szukasz: -f, --file string Nazwa pliku Dockerfile (Domyślnie to 'PATH / Dockerfile')
blasrodri
2
Uczyłeś się Dockera w 2013 roku. To jest przewidywanie.
mcan

Odpowiedzi:

210

Zauważ, że .na końcu obu poleceń znajduje się kropka .

docker build -f MyDockerfile.

Lub z tagiem:

docker build -t mysuperimage -f MyDockerfile.

Andrzej Rehmann
źródło
1
docker build -f Dockerfile.consumerwyświetla mi błąd „Docker build” wymaga dokładnie 1 argumentu. Zobacz „Docker build --help”. Użycie: docker build [OPTIONS] PATH | URL | -
kamal
12
@kamal Czy zauważyłeś kropkę ( .) na końcu powyższego polecenia?
Sateesh Pagolu
7
Mówię tylko - wymagając dodania. jest po prostu irytujący
myloginid
2
Nie .jest to wymagane. Polecenie budowania przyjmuje dwa argumenty, a mianowicie. ścieżka do Dockerfile& ścieżka do contextkatalogu. Więc możemy zrobićdocker build -t mysupertag -f ./foo/Dockerfile ./foo
Mohnish
22

Ostatnim parametrem budowania dockera jest ścieżka budowania, kiedy to umieścisz ., oznacza to, że jest to ścieżka, w której znajdziesz plik Dockerfile. Kiedy go zmienisz, Dockerfile.appbędzie próbował szukać Dockerfile.app/Dockerfile, co nie jest poprawne.

Nie jestem pewien, czy to nadal będzie działać, ale kiedyś byłeś w stanie to zrobić.

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

Spróbuj tego i zobacz, czy to pomaga, a jeśli nie, może otwórz problem z Dockerem, aby ponownie dodać tę funkcję, lub zaktualizuj dokumentację dotyczącą używania pliku Dockerfile o innej nazwie.

Więcej informacji tutaj: http://docs.docker.io/en/latest/commandline/command/build/

Ken Cochrane
źródło
1
Wypróbowałem adres URL i działa. Ścieżka również powinna działać zgodnie z dokumentami. zgłosi błąd.
deepak
5
zgodnie z dokumentami, które udostępniłeś (dzięki). docker build - < Dockerfilenie pozwoli mi DODAĆ lokalnego pliku. Ale wypróbowałem to i działa
deepak
2
ale chcę podać inny plik Dockerfile i nadal mam kontekst, tj. Dodaj pliki. więc
zgłosię
Spowoduje to po prostu utworzenie kontekstu z pojedynczym plikiem Dockerfile. Wszystkie pliki pomocnicze nie zostaną uwzględnione w kontekście.
itsafire
12

Wypróbuj dockerfeed . Używa funkcji dockera do budowania kontekstu poprzez stdin. Napisałem skrypt, aby dokładnie rozwiązać twój problem, z którym sam miałem do czynienia.

Aby zamienić plik Dockerfile na inny, wykonaj to w następujący sposób:

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

I voilà. Dockerfeed robi to samo, co docker build. Pakuje źródło z jego plikiem Dockerfile, ale pozwala zamienić stary plik Dockerfile na żądany. Żadne pliki nie są tworzone w procesie, żadne źródło nie jest zmieniane. Wygenerowane archiwum tar jest przesyłane potokiem do dockera, który z kolei wysyła je do demona dockera.

Aktualizacja: To była prawidłowa odpowiedź w dawnych czasach, kiedy nie było -fdostępnego przełącznika. W Docker w wersji 1.5 ta opcja została wprowadzona. Teraz możesz zbudować i dostarczyć inny plik Dockerfile w następujący sposób:

docker build -f other-Dockerfile .
itsafire
źródło
5

Możesz to osiągnąć również za pomocą docker-compose.

W pliku docker-compose.yml w sekcji kompilacji możesz określić katalog, w którym przechowujesz plik dockerfile i jego alternatywną nazwę w następujący sposób:

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

docker-compose

wał
źródło
0

Załóżmy, że pomyślnie zainstalowałeś docker toolbox, w tym docker-compose i docker-machine . To jest mój plik docker-compose.yml

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

A to jest w Dockerfile

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

Upewnij się, że te pliki znajdują się dokładnie w folderze głównym. Po uruchomieniu docker-compose up zbudujesz obraz dla sieci.

Faris Rayhan
źródło
0

Mój przypadek jest w /tmpkatalogu i jest tam dużo plików, a docker próbuje z innymi plikami, chociaż zdałem-f <Dockerfile.foo>

Najczystszym i najłatwiejszym (dla mnie) rozwiązaniem jest (przeczytaj dockerfeedpowyższe odpowiedzi):

cat DockerFile.debian.foo | docker build -t debian.foo -
tres.14159
źródło
0

Użytkownik systemu Windows powinien wypróbować poniższe polecenie:

docker build -f absolute_docker_file_path kropka

na przykład :

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

Nikhil Vats
źródło