ไม่สามารถสร้าง Dockerfile เฉพาะได้


95

ฉันสามารถสร้าง Dockerfile เช่น

docker build -t deepak/ruby .

แต่สำหรับ Dockerfile ที่ไม่มีชื่อ Dockerfile

# DOCKER-VERSION 0.4.8

FROM deepak/ruby

MAINTAINER Deepak Kannan "deepak@example.com"

RUN ./bin/rails s

ให้เราบอกว่ามันถูกเรียกว่าDockerfile.app เราสร้างด้วย

docker build -t deepak/app Dockerfile.app

จากนั้นฉันได้รับข้อผิดพลาด

Uploading context 0 bytes
Error build: EOF
EOF

15
คำถามของคุณคือฉันจะสร้าง Dockerfile ได้อย่างไรหากชื่อของ Dockerfile ไม่ใช่ Dockerfile
Ken Cochrane

1
@KenCochrane ใช่ นั่นคือคำถาม
deepak

1
หากคุณเรียกใช้docker build --helpมีบรรทัดที่คุณสามารถค้นหาสิ่งที่คุณกำลังมองหา: -f, --file string Name ของ Dockerfile (ค่าเริ่มต้นคือ 'PATH / Dockerfile')
blasrodri

2
คุณกำลังเรียนรู้ Docker ในปี 2013 นี่คือการมองการณ์ไกล
mcan

คำตอบ:


220

สังเกตว่ามีจุด.ท้ายคำสั่งทั้งสองคำสั่ง

นักเทียบท่าสร้าง -f MyDockerfile

หรือด้วยแท็ก:

นักเทียบท่าสร้าง -t mysuperimage -f MyDockerfile


2
docker build -f Dockerfile.consumerทำให้ฉันมีข้อผิดพลาด "docker build" ต้องการ 1 อาร์กิวเมนต์ โปรดดูที่ 'Docker build --help' การใช้งาน: นักเทียบท่าสร้าง [OPTIONS] เส้นทาง | URL | -
kamal

15
@kamal คุณสังเกตเห็นจุด ( .) ที่ท้ายคำสั่งด้านบนหรือไม่?
Sateesh Pagolu

7
เพียงแค่บอกว่า - ต้องเพิ่มไฟล์. เป็นเพียงการระคายเคืองธรรมดา
myloginid

2
.ไม่ได้เป็นสิ่งที่จำเป็น คำสั่ง build ใช้เวลาสอง args ได้แก่ เส้นทางไปยังDockerfile& เส้นทางไปยังcontextไดเรกทอรี ดังนั้นเราสามารถทำได้docker build -t mysupertag -f ./foo/Dockerfile ./foo
Mohnish


23

พารามิเตอร์สุดท้ายของการสร้างนักเทียบท่าคือเส้นทางการสร้างเมื่อคุณใส่.หมายความว่านี่คือเส้นทางที่คุณจะพบไฟล์Dockerfile. เมื่อคุณเปลี่ยนเป็นDockerfile.appแล้วจะพยายามค้นหาDockerfile.app/Dockerfileซึ่งไม่ถูกต้อง

ฉันไม่แน่ใจว่ามันจะยังใช้ได้ไหม แต่คุณเคยทำได้

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

ลองใช้และดูว่าช่วยได้หรือไม่ถ้าไม่อาจเปิดปัญหานักเทียบท่าเพื่อเพิ่มคุณสมบัตินี้กลับเข้าไปหรืออัปเดตเอกสารเกี่ยวกับวิธีใช้ Dockerfile ด้วยชื่ออื่น

ข้อมูลเพิ่มเติมที่นี่: http://docs.docker.io/en/latest/commandline/command/build/


1
ฉันได้ลองใช้ url แล้วและใช้งานได้ เส้นทางควรทำงานตามเอกสาร จะยื่นข้อบกพร่อง
deepak

5
ตามเอกสารที่คุณแบ่งปัน (ขอบคุณ) docker build - < Dockerfileจะไม่อนุญาตให้ฉันเพิ่มไฟล์ในเครื่อง แต่ลองใช้แล้วได้ผล
deepak

2
แต่ฉันต้องการให้ Dockerfile อื่นและยังมีบริบทคือ เพิ่มไฟล์ ดังนั้นฉันจะยื่นข้อบกพร่อง
deepak

สิ่งนี้จะสร้างบริบทโดยมี Dockerfile ตัวเดียวอยู่ในนั้น ไฟล์ที่รองรับทั้งหมดจะไม่ทำให้เข้าในบริบท
itsafire

13

ลองdockerfeed ใช้คุณสมบัตินักเทียบท่าเพื่อสร้างบริบทผ่านทาง stdin ฉันเขียนสคริปต์เพื่อแก้ไขปัญหาของคุณที่ฉันกำลังเผชิญอยู่

ในการแทนที่ Dockerfile ด้วยไฟล์อื่นให้ทำดังนี้:

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

และ voila. Dockerfeed ทำเช่นเดียวกับdocker build. มันบรรจุแหล่งที่มาพร้อมกับ Dockerfile แต่ให้คุณสลับ Dockerfile เก่ากับอันที่ต้องการได้ ไม่มีการสร้างไฟล์ในกระบวนการไม่มีการเปลี่ยนแหล่งที่มา ไฟล์เก็บถาวร tar ที่สร้างขึ้นจะถูกส่งไปยัง docker ซึ่งจะส่งลงไปยัง docker daemon

อัปเดต: นี่เป็นคำตอบที่ถูกต้องในสมัยก่อนเมื่อไม่มี-fสวิตช์ ด้วย Docker เวอร์ชัน 1.5 ตัวเลือกนี้ถูกนำมาใช้ ตอนนี้คุณสามารถสร้าง Dockerfile ที่แตกต่างกันได้ดังนี้:

docker build -f other-Dockerfile .

5

คุณสามารถบรรลุสิ่งนี้ได้โดยใช้ Docker-compose

ใน docker-compose.yml ของคุณภายใต้ส่วน build คุณสามารถระบุไดเร็กทอรีที่คุณจัดเก็บ dockerfile ของคุณและชื่อสำรองดังต่อไปนี้:

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

นักเทียบท่าเขียน


1

ผู้ใช้ Windows ควรลองใช้คำสั่งด้านล่าง:

นักเทียบท่าสร้าง -f absolute_docker_file_path dot

ตัวอย่างเช่น :

นักเทียบท่าสร้าง -f D: \ Code \ core-api \ API_TEST.Dockerfile


0

อนุญาตสมมติว่าคุณได้ประสบความสำเร็จในการติดตั้งกล่องนักเทียบท่ารวมทั้งนักเทียบท่า-เขียนและนักเทียบท่าเครื่อง นี่คือ docker-compose.yml ของฉัน

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

และนี่คือภายใต้ Dockerfile

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

ตรวจสอบให้แน่ใจว่าไฟล์เหล่านั้นอยู่ในโฟลเดอร์รูทอย่างแม่นยำ เมื่อคุณเรียกใช้ Docker-compose แล้วคุณจะสร้างภาพสำหรับเว็บ


0

กรณีของฉันอยู่ใน/tmpไดเร็กทอรีและมีไฟล์จำนวนมากและนักเทียบท่าลองกับไฟล์อื่นแม้ว่าฉันจะส่งไฟล์-f <Dockerfile.foo>

วิธีแก้ปัญหาที่สะอาดและง่ายที่สุด (สำหรับฉัน) คือ (สรุปdockerfeedจากคำตอบด้านบน):

cat DockerFile.debian.foo | docker build -t debian.foo -
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.