Docker: tidak dapat menyiapkan konteks: tidak dapat mengevaluasi symlink di jalur Dockerfile: GetFileAttributesEx

189

Saya baru saja mengunduh Docker Toolbox untuk Windows 10 64bit hari ini. Saya akan melalui tutorial. Saya menerima kesalahan berikut ketika mencoba membangun gambar menggunakan Dockerfile.

Langkah:

  • Meluncurkan terminal Docker Quickstart.
  • testdocker setelah membuatnya.
  • Mempersiapkan Dockerfile sebagaimana didokumentasikan dalam tautan web "Build your own"
  • berlari di bawah komando

docker build -t docker-whale .

Error: $ docker build -t docker-whale .

unable to prepare context: unable to evaluate symlinks in Dockerfile path: GetFileAttributesEx C:\Users\Villanueva\Test\testdocker\Dockerfile: The system cannot find the file specified.

BTW: Saya mencoba beberapa opsi yang disebutkan @ https://github.com/docker/docker/issues/14339

    $ docker info
    Containers: 4
     Running: 0
     Paused: 0
     Stopped: 4
    Images: 2
    Server Version: 1.10.1
    Storage Driver: aufs
     Root Dir: /mnt/sda1/var/lib/docker/aufs
     Backing Filesystem: extfs
     Dirs: 20
     Dirperm1 Supported: true
    Execution Driver: native-0.2
    Logging Driver: json-file
    Plugins:
     Volume: local
     Network: bridge null host
    Kernel Version: 4.1.17-boot2docker
    Operating System: Boot2Docker 1.10.1 (TCL 6.4.1); master : b03e158 - Thu Feb 11 22:34:01 UTC 2016
    OSType: linux
    Architecture: x86_64
    CPUs: 1
    Total Memory: 996.2 MiB
    Name: default
    ID: C7DS:CIAJ:FTSN:PCGD:ZW25:MQNG:H3HK:KRJL:G6FC:VPRW:SEWW:KP7B
    Debug mode (server): true
     File Descriptors: 32
     Goroutines: 44
     System Time: 2016-02-19T17:37:37.706076803Z
     EventsListeners: 0
     Init SHA1:
     Init Path: /usr/local/bin/docker
     Docker Root Dir: /mnt/sda1/var/lib/docker
    Labels:
     provider=virtualbox
villanux
sumber
4
Update: buruh pelabuhan membangun t XXX --file ./Dockefile. bekerja. Docker mungkin ingin memperbarui dokumentasinya untuk pengguna Windows.
villanux
4
Jika docker build -t XXX --file ./Dockefileitu mungkin karena Anda mendapatkan nama file yang salah itu kehilangan R.
eXa
17
Ini adalah pesan kesalahan yang sangat buruk, itu hanya berarti "tidak dapat membuka file" - sama di Linux dan macOS.
RichVel
Pesan kesalahan yang sangat buruk.
Penebusan Terbatas

Jawaban:

205

saat menjalankan perintah berikut:

docker build -t docker-whale .

periksa apakah Dockerfile ada di direktori kerja Anda saat ini.

kalyani chaudhari
sumber
28
Terima kasih. Masalah saya adalah saya telah membuat Dockerfile saya di Notepad dan secara otomatis menambahkan .txt ke nama file.
IanGSY
5
Anda juga dapat secara eksplisit menulis nama Dockerfile dengan fbendera, seperti dalam docker build -f Dockerfile-dev.yaml -t my_container .Hal ini mungkin berguna jika Anda memiliki beberapa Dockerfile di proyek Anda, satu per lingkungan, misalnya. Hal yang sama berlaku untuk komposisi buruh pelabuhan. Menempatkan mereka di subdirektori yang berbeda tidak akan berfungsi, karena konteksnya ( .) tidak akan cocok.
Sumi Straessle
1
@IanGSY Saya berharap bisa memberi Anda lebih banyak poin untuk itu. Itulah masalah saya juga!
K. Brafford
5
Notepad adalah program yang terlalu jahat.
Per Lundberg
98

Memalukan!

Pesan kesalahan menyesatkan. Masalahnya sebenarnya tidak ada hubungannya dengan symlinks. Biasanya hanya buruh pelabuhan yang tidak dapat menemukan Dockerfile yang menggambarkan bangunan.

Alasan umum adalah ini:

  • Dockerfile memiliki nama yang salah .
    Itu harus disebut Dockerfile. Jika hal itu disebut, misalnya, dockerfile, .Dockerfile, Dockerfile.txt, atau lainnya, itu tidak akan ditemukan.
  • Dockerfile tidak dalam konteks .
    Jika Anda mengatakan docker build contextdir, Dockerfile harus di contextdir/Dockerfile. Jika Anda memilikinya, katakan ./Dockerfilesaja, itu tidak akan ditemukan.
  • Dockerfile tidak ada sama sekali .
    Kedengarannya konyol? Yah, saya mendapat pesan kesalahan di atas dari GitLab CI saya setelah saya menulis Dockerfile yang bagus, tetapi lupa untuk memeriksanya. Konyol? Tentu. Tidak sepertinya? Tidak.

Ini bukan satu-satunya rasa malu ...

Tidak hanya pesan kesalahan yang satu ini tidak jelas dan membingungkan. Saya biasanya menemukan beberapa konsep buruh pelabuhan dan banyak dokumentasi yang tidak tepat secara semantik.

Salah satu tempat yang benar-benar buruk adalah gagasan "tag" (pada Agustus 2019). Tergantung di mana Anda melihat dalam dokumentasi, itu mengatakan semua hal berikut (kurang lebih jelas):

  • Ada tagperintah, tetapi argumen yang Anda berikan tidak disebut tag atau nama tag, itu disebut nama gambar.
  • Nama gambar terdiri dari nama gambar dan tag, dipisahkan oleh tanda titik dua.
  • Dalam tagargumen perintah, nama tag adalah opsional tetapi nama gambar wajib. Jelas.
  • Dalam kata-kata halaman dokumentasi:
    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • Tetapi tidak semua nama gambar dalam nama gambar itu sebenarnya adalah nama gambar, karena nama gambar dapat diawali dengan nama host.
  • Meskipun kadang-kadang bahwa nama host bagian yang dianggap sebagai bagian dari nama gambar.
  • Bagaimanapun, sebuah gambar dengan nama host xdi (atau sebelumnya, tetapi entah bagaimana secara ajaib selalu melekat) nama gambarnya kemudian seharusnya hidup di host itu x(dalam registri). Jika Anda ingin mengakses gambar seperti itu, Anda kurang lebih harus menggunakan nama ini dengan awalan host x.
  • Tetapi gambar dengan nama itu dapat hidup pada host mana pun, tidak hanya pada x, karena "mendorong" gambar ke xadalah operasi yang terpisah.
  • Jadi melihat nama itu dalam daftar gambar buruh pelabuhan tidak berarti banyak, tetapi pasti akan menyindir sesuatu. Terkadang salah.
  • Omong-omong: Apakah saya menyebutkan ruang nama? Mereka dapat pergi antara nama host dan nama gambar di nama gambar. Dan juga merupakan bagian dari nama gambar atau tidak, tergantung di mana Anda melihat.

Jika Anda bingung dengan ini, itu bukan salah Anda.

Akhir kata-kata kasar.

Lutz Prechelt
sumber
Saya pikir ini akan menjadi jawaban yang jauh lebih kuat (dan lebih relevan) tanpa babak ke-2.
Paul Gear
1
Jawaban yang bagus, dan terima kasih atas informasi latar belakang
leon
Kiat tambahan yang memecahkan masalah saya dengan pesan yang sama: pastikan CaSinG Anda sudah benar. Untuk jalur Direktori serta Dockerfile. Karena linux sangat pemilih soal itu.
RaimondB
38

Jika Anda bekerja di windows 8 Anda akan menggunakan kotak alat Docker. Dari direktori mydockerbuild, jalankan perintah di bawah ini karena Dockerfile Anda adalah file teks

docker build -t docker-whale -f ./Dockerfile.txt .
Divyanshu sachdeva
sumber
3
untuk referensi di masa mendatang jika Anda perlu melakukan ini karena Dockerfile Anda memiliki ekstensi sedangkan Docker secara default mengharapkannya juga. Mengatur file secara manual dengan ekstensi menambah sakit kepala yang tidak Anda butuhkan. Anda harus mengatur Windows explorer untuk menampilkan ekstensi dan kemudian menghapus ekstensi.
Alex
jika Anda mengikuti tutorial tentang buruh pelabuhan "memulai" Anda akan menggunakan ini:docker build -t friendlyhello -f ./Dockerfile.txt .
Mike Kellogg
Semantiknya benar-benar buruk sehingga Anda harus menentukan nama file dan path dummy juga. dan / atau selalu beri nama file Anda sebagai Dockerfile .. :-(
myloginid
Ini menyelamatkan hari saya. Ngomong-ngomong, saya menggunakan mesin Mac. Tapi yang menarik di sini adalah Dockerfile dibuat file teks biasa. Terima kasih sobat untuk bantuannya.
Sachidananda Naik
23

Nama file seharusnya Dockerfiledan bukan .Dockerfile. File tidak boleh memiliki ekstensi apa pun.

SharpCoder
sumber
14

Saya menamai file dockerfile saya alih-alih Dockerfile (dengan huruf besar), dan begitu saya mengubahnya, file itu mulai memproses "Dockerfile" saya.

Alan Fitzgerald
sumber
14

Hapus saja ekstensi .txt dari Dockerfile dan jalankan perintah

docker build -t image-name 

Pasti akan berhasil.

satya
sumber
9

Saya mendapatkan kesalahan ini (di MacBook) meskipun saya menggunakan perintah yang benar untuk membuat gambar,

docker build -t testimg .

Kemudian saya menemukan bahwa jalan adalah masalahnya. Navigasikan ke jalur yang benar yang berisi file buruh pelabuhan. Cukup periksa direktori kerja Anda saat ini. Tidak ada yang panik!

arunprakashpj
sumber
4

Di windows 10 ... periode adalah parameter pertama

docker build . -t docker-whale

PDA
sumber
8
tidak lagi (jika pernah) docker build -t docker-whale .adalah perintah yang valid
sebagomez
4

Itu hanya karena Notepad menambahkan ".txt" di akhir Dockerfile

Aurélien
sumber
4

Di WSL, tampaknya ada masalah dengan konversi jalur. Lokasi Dockerfile di Ubuntu (tempat saya menjalankan docker dan tempat Dockerfile tinggal) adalah "/ home / sxw455 / App1", tetapi tidak satu pun dari perintah ini bekerja:

$ pwd
/home/sxw455/App1
$ ll
total 4
drwxrwxrwx 0 sxw455 sxw455 4096 Dec 11 19:28 ./
drwxr-xr-x 0 sxw455 sxw455 4096 Dec 11 19:25 ../
-rwxrwxrwx 1 sxw455 sxw455  531 Dec 11 19:26 Dockerfile*
-rwxrwxrwx 1 sxw455 sxw455  666 Dec 11 19:28 app.py*
-rwxrwxrwx 1 sxw455 sxw455   12 Dec 11 19:27 requirements.txt*

$ docker build -t friendlyhello .
unable to prepare context: unable to evaluate symlinks in Dockerfile path: GetFileAttributesEx C:\Windows\System32\Dockerfile: The system cannot find the file specified.

$ docker build -t friendlyhello "/home/sxw455/App1"
unable to prepare context: path "/home/sxw455/App1" not found

Namun di Windows, jalur sebenarnya adalah:

C:\Users\sxw455\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfs\home\sxw455\App1

Jadi saya harus melakukan ini (walaupun saya berlari dari bash):

$ docker build -t friendlyhello 
"C:\Users\sxw455\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfs\home\sxw455\App1"

Sending build context to Docker daemon   5.12kB
Step 1/7 : FROM python:2.7-slim
 ---> 0dc3d8d47241
Step 2/7 : WORKDIR /app
 ---> Using cache
 ---> f739aa02ce04
Step 3/7 : COPY . /app
 ---> Using cache
 ---> 88686c524ae9
Step 4/7 : RUN pip install --trusted-host pypi.python.org -r requirements.txt
 ---> Using cache
 ---> b95f02b14f78
Step 5/7 : EXPOSE 80
 ---> Using cache
 ---> 0924dbc3f695
Step 6/7 : ENV NAME World
 ---> Using cache
 ---> 85c145785b87
Step 7/7 : CMD ["python", "app.py"]
 ---> Using cache
 ---> c2e43b7f0d4a
Successfully built c2e43b7f0d4a
Successfully tagged friendlyhello:latest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

Saya memiliki masalah yang sama dengan variabel lingkungan selama instalasi awal, dan mengikuti beberapa saran yang mengatakan untuk menginstal Windows DockerCE dan meretas variabel lingkungan daripada menginstal DockerCE Ubuntu, karena (saya harap saya ingat ini dengan benar) bahwa WSL tidak sepenuhnya menerapkan systemctl. Setelah instalasi Windows Docker CE dilakukan dan variabel lingkungan diatur, buruh pelabuhan kemudian bekerja dengan baik di bawah WSL / Ubuntu.

Komis
sumber
Ini berhasil untuk saya! Saya hanya menginstal Docker Toolbox dan tidak menginstalnya di WSL; sebagai gantinya, saya menggunakan executable windows secara langsung, karena WSL dapat melakukannya sekarang.
Lawrence Lee
4

Saya telah membuat DockerFile oleh alat Dukungan Docker VS2017 dan memiliki kesalahan yang sama. Setelah beberapa saat saya menyadari bahwa saya tidak berada di direktori yang benar yang berisi Dockerfile (~\source\repos\DockerWebApplication\). cd ke file (~/source/repos/DockerWebApplication/DockerWebApplication)yang benar yang ada di dalam proyek dan berhasil membuat gambar buruh pelabuhan.

Hasan
sumber
4

Perintah di bawah ini berfungsi untuk saya build buruh pelabuhan -t docker-whale -f Dockerfile.txt.

AMAN BHARDWAJ
sumber
Dockerfile bukan file .txt. Jika Anda memilikinya sebagai file .txt itu akan memberikan kesalahan lagi.
Donald Shahini
3

Dua cara untuk membangun buruh pelabuhan:

Anda dapat memutuskan untuk tidak menentukan nama file yang akan dibangun dan hanya membangunnya menentukan jalur (melakukannya dengan cara ini nama file harus Dockerfiletanpa ekstensi ditambahkan, misalnya:docker build -t docker-whale:tag path/to/Dockerfile

atau

Anda dapat menentukan file dengan -fdan tidak peduli apa ekstensi (dalam alasan .txt, .dockerfile, .Dockerfiledll ..) Anda memutuskan untuk menggunakan, misalnya docker build -t docker-whale:tag /path/to/file -f docker-whale.dockerfile.

PontiusTheBarbarian
sumber
2

Saya awalnya membuat Dockerfile saya di PowerShell dan meskipun saya tidak melihat ekstensi pada file itu menunjukkan sebagai PS File Type ... setelah saya membuat file dari Notepad ++ memastikan untuk memilih "All types ( . )" File Ketik tanpa ekstensi pada Nama File (Dockerfile). Itu memungkinkan perintah membangun gambar saya berhasil diselesaikan .... Pastikan Dockerfile Anda memiliki Jenis "File" ...

Helper7123
sumber
2

Masalahnya adalah bahwa nama file harus Dockerfile dan bukan DockerFile atau dockerfile itu harus huruf D diikuti oleh ockerfile dalam huruf kecil, harap dicatat

vincent
sumber
2

Pastikan Anda DOCKERfileberada di ROOT direktori aplikasi, saya punya tambang di src yang mengakibatkan kesalahan ini karena Docker tidak menemukan jalan keDOCKERfile

Frank Odoom
sumber
1

Untuk membuat Dockerfile menyimpan konten otomatis di Dockerfile. bukan Dockerfile karena saat membuka perintah file:

$ notepad Dockerfile 

(File teks ditulis sehingga file tidak dapat membangun)

Untuk membangun menjalankan file:

$ notepad Dockerfile

dan Sekarang jalankan:

$ docker build -t docker-whale .

Pastikan Anda berada di direktori Dockerfile saat ini.

niteshkumarmodi
sumber
1

Yang paling penting pastikan nama file Anda adalah Dockerfilejika Anda menggunakan nama lain itu tidak akan berfungsi (setidaknya itu tidak untuk saya.)

Juga jika Anda berada di dir yang sama di mana Dockerfile menggunakan .ie docker build -t Myubuntu1:v1 . atau menggunakan path absolut yaitu docker build -t Myubuntu1:v1 /Users/<username>/Desktop/Docker

ady6831983
sumber
1

Saya kasus saya (lari dari Windows 10)
1) Ubah nama file myDockerFile.Dockerfilemenjadi Dockerfile( tanpa ekstensi file).
Kemudian jalankan perintah dari luar folder ini:

docker build .\Docker-LocalNifi\ 

Ini bekerja untuk saya dan untuk rekan-rekan saya di tempat kerja, berharap itu juga akan bekerja untuk Anda

Yohan
sumber
1

Pastikan nama file "Dockerfile" tidak disimpan dengan ekstensi apa pun. Cukup buat file tanpa ekstensi apa pun.

Dan pastikan Dockerfile berada di direktori yang sama dari tempat Anda mencoba membangun image buruh pelabuhan.

Nakesh
sumber
1

Jika kami memiliki beberapa file buruh pelabuhan di lingkungan kami, Dockerfile tidak akan mencukupi kebutuhan kami.

docker build -t ihub -f Dockerfile.ihub .

Jadi gunakan perintah file(-f argumen) untuk menentukan file buruh pelabuhan Anda (Dockerfile.ihub)

chethan bhounsley g
sumber
Anda juga perlu memiliki .(titik) di akhir baris, seperti yang ditunjukkan di atas.
Purplejacket
Dokumentasi untuk di docker buildsini: docs.docker.com/engine/reference/commandline/build
Purplejacket
0

Saya mendapatkan ini di Windows ketika jalur tempat saya bekerja berada di bawah direktori Junction. Jadi perbaikan saya adalah tidak bekerja di bawah jalur itu.

Chris F Carroll
sumber
0

Di Mac berfungsi untuk perintah di bawah ini. (harap Anda .Dockerfileada di direktori root Anda).

docker build -t docker-whale -f .Dockerfile .
Kaldera Chanaka
sumber
0

Masalah ini terkait dengan prosedur pembuatan DockerFile.

Untuk bekerja, buka cmd, cd ke direktori yang menarik dan ketik:

abc>DockerFile

Ini akan membuat file bernama DockerFile di dalam folder Anda.

Sekarang ketik:

notepad DockerFile 

Ini akan membuka file DockerFile di notepad dan Anda harus menyalin / menempel kode standar yang disediakan.

Simpan file dan sekarang, akhirnya, buat gambar Anda dengan mengetik Docker:

docker build -t docker-whale . 

Ini bekerja untuk saya dan saya harap ini membantu orang lain

Karyawan
sumber
0

Saya keliru dibuat Dockerfile.txtdi direktori kerja saya yang mengarah ke kesalahan sementara yang disebutkan di atasbuild

Cara mengatasinya adalah menghapus .txtekstensi dari file.

Nama file harus Dockerfilehanya tanpa ekstensi apa pun .

iCantC
sumber
0

Jalankan docker build -t getting-started .di direktori proyek Anda dan pastikan Dockerfile hadir dan tidak memiliki .txtekstensi. Jika Anda menggunakan Windows, periksa 'ekstensi nama file' di tab tampilan di bawah di File Explorer untuk menunjukkan apakah .txt ada atau tidak dan hapus jika yang pertama benar. Semoga berhasil.

Abdellah Ramadan
sumber
0

Saya juga menghadapi masalah yang sama dan diselesaikan ketika saya membuat file bernama dengan DockerFile dan menyebutkan semua perintah yang ingin dieksekusi saat membuat gambar apa pun.

Yoshita Mahajan
sumber
0

Kesalahan berarti bahwa docker buildbaik menggunakan PATH | URLinput yang salah atau bahwa Dockerfiletidak dapat ditemukan di direktori saat ini. Juga, pastikan bahwa ketika menjalankan perintah dari terminal terintegrasi (mis. Di bashdalam IDE atau editor teks) Anda memiliki izin admin untuk melakukannya. Terbaik jika Anda dapat memeriksa PATHdari terminal Anda dengan pwd(di bash shellatau dirjika menggunakan sederhana clidi windows) dan salin jalur yang tepat di mana Anda ingin gambar akan dibangun.

docker build C:\windows\your_amazing_directory

docker build --help juga akan menunjukkan kepada Anda opsi yang tersedia untuk digunakan jika ada perintah yang salah atau ilegal.

rags2riches
sumber
-1

Saya mencoba ini dan berhasil:

$ docker build -t test_dotnet_image 
"C:\Users\ssundarababu\Documents\Docker\Learn\SimpleDockerfile"

Silakan lihat tanda kutip + batalkan tanda kutip di sekitar nama pengguna.

Catatan: Di Folder "C:\Users\ssundarababu\Documents\Docker\Learn\SimpleDockerfile"saya punya Dockerfile saya.

Sudharsan S
sumber
-1

Untuk membangun gambar dari command-line di windows / linux. 1. Buat file buruh pelabuhan di direktori Anda saat ini. mis: FROM ubuntu RUN apt-get update RUN apt-get -y install apache2 ADD. / var / www / html ENTRYPOINT apachectl -D FOREGROUND ENV nama Devops_Docker 2. Jangan simpan dengan ekstensi .txt. 3. Di bawah command-line jalankan build docker perintah. -t apache2image

Udit Gandhi
sumber