Docker: impossibile preparare il contesto: impossibile valutare i symlink nel percorso Dockerfile: GetFileAttributesEx


189

Ho appena scaricato Docker Toolbox per Windows 10 a 64 bit oggi. Sto seguendo il tutorial. Ricevo il seguente errore quando provo a creare un'immagine usando un Dockerfile.

passi:

  • Terminale Docker Quickstart avviato.
  • testdocker dopo averlo creato.
  • Preparare Dockerfile come documentato nel collegamento Web "Crea la tua immagine"
  • corse sotto il comando

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.

A proposito: ho provato diverse opzioni menzionate @ 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

4
Aggiornamento: docker build -t XXX --file ./Dockefile. lavorato. Docker potrebbe voler aggiornare la propria documentazione per gli utenti Windows.
villanux,

4
Se docker build -t XXX --file ./Dockefileè perché hai sbagliato il nome del file, manca R.
eXa

17
Questo è un messaggio di errore incredibilmente negativo, significa semplicemente "impossibile aprire il file" - lo stesso su Linux e macOS.
RichVel,

Messaggio di errore pessimo.
Espiazione limitata il

Risposte:


205

durante l'esecuzione del seguente comando:

docker build -t docker-whale .

controlla che Dockerfile sia presente nella tua attuale directory di lavoro.


28
Grazie. Il mio problema era che avevo creato il mio Dockerfile in Blocco note e aveva aggiunto automaticamente .txt al nome del file.
IanGSY,

5
Puoi anche scrivere esplicitamente il nome Dockerfile con il fflag, come in docker build -f Dockerfile-dev.yaml -t my_container .Ciò può rivelarsi utile se hai diversi Dockerfile nel tuo progetto, uno per ambiente, ad esempio. Lo stesso vale per la finestra mobile-componi. Inserirli in diverse sottodirectory non funzionerà, poiché il contesto ( .) non corrisponderà.
Sumi Straessle,

1
@IanGSY Vorrei poterti dare più punti per questo. Anche quello era esattamente il mio problema!
K. Brafford,

5
Notepad è un programma eccessivamente malvagio.
Per Lundberg,

98

È un peccato!

Il messaggio di errore è fuorviante. Il problema non ha nulla a che fare con i collegamenti simbolici. Di solito è solo che la finestra mobile non riesce a trovare il file Docker che descrive la build.

I motivi tipici sono questi:

  • Dockerfile ha un nome errato .
    Deve essere chiamato Dockerfile. Se si chiama, per esempio, dockerfile, .Dockerfile, Dockerfile.txt, o altro, non sarà trovato.
  • Dockerfile non è nel contesto .
    Se dici docker build contextdir, il Dockerfile deve essere a contextdir/Dockerfile. Se ce l'hai dentro, diciamo ./Dockerfileinvece che non sarà trovato.
  • Dockerfile non esiste affatto .
    Sembra sciocco? Bene, ho ricevuto il messaggio di errore sopra riportato dal mio GitLab CI dopo aver scritto un bel Dockerfile, ma ho dimenticato di registrarlo. Silly? Sicuro. Improbabile? No.

Non è l'unica vergogna ...

Non solo questo messaggio di errore è vago e confuso. In genere trovo che alcuni dei concetti della finestra mobile e gran parte della documentazione siano semanticamente imprecisi.

Uno dei punti peggiori è la nozione di "tag" (ad agosto 2019). A seconda di dove guardi nella documentazione, sta dicendo tutte le seguenti cose (più o meno chiaramente):

  • C'è il tagcomando, ma l'argomento fornito non si chiama tag o nome tag, si chiama nome immagine.
  • Un nome immagine è composto da un nome immagine e un tag, separati da due punti.
  • Nel tagargomento del comando, il nome del tag è facoltativo, ma il nome dell'immagine è obbligatoria. Ovvio.
  • Nelle parole della pagina della documentazione:
    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • Ma non tutto il nome dell'immagine in quel nome è in realtà il nome dell'immagine, perché il nome dell'immagine può essere preceduto da un nome host.
  • Anche se a volte quella parte del nome host è considerata parte del nome dell'immagine.
  • In ogni caso, un'immagine con un nome host xin (o prima, ma in qualche modo magicamente sempre aggrappato a) il suo nome immagine dovrebbe quindi vivere su quell'host x(in un registro). Se si desidera accedere a tale immagine, è più o meno necessario utilizzare questo nome con prefisso host x.
  • Ma un'immagine con quel nome può vivere su qualsiasi host, non solo su x, perché "spingere" l'immagine xè un'operazione separata.
  • Quindi vedere quel nome in un elenco di immagini docker non significa molto, ma sicuramente insinuerà qualcosa. A volte a torto.
  • A proposito: ho già parlato di spazi dei nomi? Possono andare tra il nome host e il nome dell'immagine nel nome dell'immagine. E fanno anche parte del nome dell'immagine o meno, a seconda di dove guardi.

Se siete confusi da questo, è non è colpa tua.

Fine del rant.


Penso che questa sarebbe una risposta molto più forte (e più pertinente) senza la seconda metà.
Paul Gear,

1
Ottima risposta, e grazie per le informazioni di base
leon

Suggerimento aggiuntivo che ha risolto il mio problema con lo stesso messaggio: assicurati di avere il tuo CaSinG corretto. Per il percorso della directory e il file Docker. Dal momento che Linux è piuttosto esigente al riguardo.
RaimondB,

38

Se stai lavorando su Windows 8, utilizzeresti la casella degli strumenti Docker. Dalla directory mydockerbuild eseguire il comando seguente poiché il Dockerfile è un file di testo

docker build -t docker-whale -f ./Dockerfile.txt .

3
per riferimento futuro se è necessario farlo è perché il Dockerfile ha un'estensione mentre per impostazione predefinita Docker non lo prevede. L'impostazione manuale del file con l'estensione aggiunge mal di testa non necessari. È necessario impostare Esplora risorse per mostrare le estensioni e quindi rimuovere l'estensione.
Alex,

se stai seguendo il tutorial sulla documentazione "docking" della docker useresti questo:docker build -t friendlyhello -f ./Dockerfile.txt .
Mike Kellogg

È una semantica davvero negativa che devi specificare anche il nome del file e il percorso fittizio. e / o nomina sempre il tuo file come Dockerfile .. :-(
miologinide

Questo mi ha salvato la giornata. A proposito, sto usando una macchina Mac. Ma il trucco qui è che il Dockerfile è stato creato un file di testo semplice. Grazie amico per l'aiuto.
Sachidananda Naik,

23

Il nome del file dovrebbe essere Dockerfilee non .Dockerfile. Il file non dovrebbe avere alcuna estensione.


14

Avevo chiamato il mio file dockerfile anziché Dockerfile (in maiuscolo) e, una volta modificato, ha iniziato a elaborare il mio "Dockerfile".


14

Rimuovere l'estensione .txt da Dockerfile ed eseguire il comando

docker build -t image-name 

Funzionerà di sicuro.


9

Ho questo errore (in MacBook) anche se ho usato il comando corretto per creare l'immagine,

docker build -t testimg .

Più tardi ho scoperto che il percorso è il problema. Basta accedere al percorso corretto che contiene il file docker. Basta ricontrollare la directory di lavoro corrente. Niente di panico!


4

In windows 10 ... il periodo è il primo parametro

docker build . -t docker-whale


8
non più (se mai) docker build -t docker-whale .è un comando valido
sebagomez il

4

Questo perché Notepad aggiunge ".txt" alla fine di Dockerfile


4

In WSL, sembra esserci un problema con la conversione del percorso. La posizione del Dockerfile in Ubuntu (dove sto eseguendo Docker e dove vive Dockerfile) è "/ home / sxw455 / App1", ma nessuno di questi comandi ha funzionato:

$ 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

Ma in Windows, il percorso effettivo è:

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

E quindi ho dovuto farlo (anche se l'ho eseguito da 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.

Ho avuto problemi simili con le variabili di ambiente durante l'installazione iniziale e ho seguito alcuni consigli che dicevano di installare Windows DockerCE e hackerare le variabili di ambiente anziché installare Ubuntu DockerCE, perché (spero di averlo ricordato correttamente) che WSL non implementa completamente systemctl. Una volta eseguita l'installazione di Windows Docker CE e impostate le variabili di ambiente, la finestra mobile funziona correttamente in WSL / Ubuntu.


Questo ha funzionato per me! Ho installato solo Docker Toolbox e non l'ho installato in WSL; invece, sto usando direttamente gli eseguibili di Windows, dato che WSL può farlo ora.
Lawrence Lee,

4

Avevo creato il mio DockerFile dallo strumento di supporto Docker VS2017 e avevo lo stesso errore. Dopo un po 'mi sono reso conto che non ero nella directory corretta che contiene il Dockerfile (~\source\repos\DockerWebApplication\). cd'ed al file corretto (~/source/repos/DockerWebApplication/DockerWebApplication)che era all'interno del progetto e ha creato correttamente l'immagine docker.


4

Sotto il comando ha funzionato per me docker build -t docker-whale -f Dockerfile.txt.


Dockerfile non è un file .txt. Se lo hai come file .txt, verrà restituito un errore.
Donald Shahini,

3

Due modi per creare un file docker:

Puoi decidere di non specificare il nome del file da cui costruire e semplicemente costruirlo specificando un percorso (facendo in questo modo il nome del file deve essere Dockerfilesenza estensione aggiunta, ad esempio:docker build -t docker-whale:tag path/to/Dockerfile

o

È possibile specificare un file con -fe non importa quale estensione (entro limiti ragionevoli .txt, .dockerfile, .Dockerfileecc ..) si decide di utilizzare, per esempio docker build -t docker-whale:tag /path/to/file -f docker-whale.dockerfile.


2

Inizialmente avevo creato il mio Dockerfile in PowerShell e sebbene non vedessi un'estensione sul file, questo veniva mostrato come un tipo di file PS ... una volta creato il file da Notepad ++ assicurandomi di selezionare il file "Tutti i tipi ( . )" Digitare senza estensione sul Nome file (Dockerfile). Ciò ha permesso al mio comando di compilazione dell'immagine di completarsi correttamente .... Assicurati solo che il tuo Dockerfile abbia un tipo di "File" ...


2

Il problema è che il nome del file dovrebbe essere Dockerfile e non DockerFile o dockerfile dovrebbe essere D maiuscolo seguito da ockerfile nella nota in minuscolo


2

Assicurati di essere DOCKERfilenel ROOT della directory dell'applicazione, ho avuto il mio in src che ha provocato questo errore perché Docker non ha trovato il percorso perDOCKERfile


1

Per creare Dockerfile, salvare il contenuto automatizzato in Dockerfile. Dockerfile perché durante l'apertura di un comando file:

$ notepad Dockerfile 

(Viene scritto un file di testo in modo che il file non possa essere creato)

Per compilare l'esecuzione del file:

$ notepad Dockerfile

e ora esegui:

$ docker build -t docker-whale .

Assicurati di essere nella directory corrente di Dockerfile.


1

Soprattutto, assicurati che il tuo nome di file sia Dockerfilese usi un altro nome che non funzionerà (almeno non ha funzionato per me).

Inoltre, se ci si trova nella stessa directory in cui si trova Dockerfile, utilizzare .ie ie docker build -t Myubuntu1:v1 . oppure utilizzare il percorso assoluto ie docker build -t Myubuntu1:v1 /Users/<username>/Desktop/Docker


1

I il mio caso (eseguito da Windows 10)
1) Rinominare il file myDockerFile.Dockerfilein Dockerfile( senza estensione).
Quindi eseguire dal di fuori della cartella questo comando:

docker build .\Docker-LocalNifi\ 

Questo funziona per me e per i miei colleghi di lavoro, spero che funzionerà anche per te


1

Assicurarsi che il nome del file "Dockerfile" non venga salvato con alcuna estensione. Basta creare un file senza alcuna estensione.

E assicurati che Dockerfile sia nella stessa directory da cui stai provando a costruire l'immagine docker.


1

Nel caso in cui abbiamo più file docker nel nostro ambiente, solo Dockerfile non sarà sufficiente per le nostre esigenze.

docker build -t ihub -f Dockerfile.ihub .

Quindi usa il filecomando (-f argomento) per specificare il tuo file docker (Dockerfile.ihub)


È anche necessario avere il .(punto) alla fine della riga, come mostrato sopra.
Purplejacket,

La documentazione per docker buildè qui: docs.docker.com/engine/reference/commandline/build
Purplejacket

0

L'ho trovato su Windows quando il percorso in cui stavo lavorando era in una directory Junction. Quindi la mia soluzione era di non funzionare su quel percorso.


0

Su Mac funziona con il comando seguente. (spero che tu .Dockerfilesia nella tua directory principale).

docker build -t docker-whale -f .Dockerfile .

0

Il problema è legato alla procedura di creazione di DockerFile.

Per funzionare, apri cmd, cd nella directory di interesse e digita:

abc>DockerFile

Questo creerà un file chiamato DockerFile all'interno della tua cartella.

Ora digita:

notepad DockerFile 

Questo aprirà il file DockerFile nel blocco note e dovrai copiare / incollare il codice standard fornito.

Salva il file e ora, infine, costruisci la tua immagine digitando Docker:

docker build -t docker-whale . 

Questo funziona per me e spero che aiuti gli altri


0

Ho erroneamente creato Dockerfile.txtnella mia directory di lavoro che porta al suddetto errore mentrebuild

La correzione era rimuovere l' .txtestensione dal file.

Il nome del file dovrebbe essere Dockerfilesolo senza alcuna estensione .


0

Eseguire docker build -t getting-started .nella directory del progetto e assicurarsi che Dockerfile sia presente e che non abbia .txtestensione. Se sei su Windows, controlla l '"estensione del nome file" nella scheda sotto la vista in Esplora file per mostrare se .txt è presente o meno e rimuovilo se il primo è vero. In bocca al lupo.


0

Ho anche affrontato gli stessi problemi ed è stato risolto quando ho creato il file denominato con DockerFile e menzionato tutto il comando che voleva essere eseguito durante la creazione di qualsiasi immagine.


0

L'errore indica che docker buildsta utilizzando un PATH | URLinput errato o che Dockerfilenon è possibile trovare nella directory corrente. Inoltre, assicurarsi che quando si esegue il comando da un terminale integrato (ad es. bashAll'interno dell'IDE o dell'editor di testo) si disponga delle autorizzazioni di amministratore per farlo. Meglio se puoi controllare PATHdal tuo terminale con pwd(dentro bash shello se stai dirusando un semplice clisu Windows) e copiare il percorso esatto in cui vuoi che l'immagine venga creata.

docker build C:\windows\your_amazing_directory

docker build --help mostrerà anche le opzioni disponibili da utilizzare in caso di comandi non validi o illegali.


-1

Ho provato questo e ha funzionato:

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

Si prega di consultare le virgolette + le virgolette attorno al nome utente.

Nota: nella cartella "C:\Users\ssundarababu\Documents\Docker\Learn\SimpleDockerfile"ho il mio Dockerfile.


-1

Per creare un'immagine dalla riga di comando in Windows / Linux. 1. Creare un file docker nella directory corrente. es: DA Ubuntu ESEGUI apt-get update ESEGUI apt-get -y installa apache2 ADD. / var / www / html ENTRYPOINT apachectl -D FORVROUND ENV name Devops_Docker 2. Non salvarlo con l'estensione .txt. 3. Sotto la riga di comando, esegui la build della finestra mobile dei comandi. -t apache2image

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.