Docker: menambahkan file dari direktori induk

186

Di saya, Dockerfilesaya punya:

ADD ../../myapp.war /opt/tomcat7/webapps/

File itu ada sebagai ls ../../myapp.warmengembalikan saya file yang benar tetapi ketika saya menjalankan sudo docker build -t myapp .saya punya:

Step 1 : ADD ../../myapp.war /opt/tomcat7/webapps/
2014/07/02 19:18:09 ../../myapp.war: no such file or directory

Apakah ada yang tahu mengapa dan bagaimana melakukannya dengan benar?

Anthony O.
sumber
2
Some workarounds superuser.com/questions/842642
Günter Zöchbauer

Jawaban:

225

Anda dapat membangun Dockerfile dari direktori induk:

docker build -t <some tag> -f <dir/dir/Dockerfile> .
Boedy
sumber
3
Terima kasih! Ini berfungsi dengan baik pada kotak lokal, tetapi Docker Hub gagal membangun gambar karena mencoba melakukannya dari direktori yang sama (tbh, hanya apa yang biasanya diharapkan). Apakah ada cara untuk melakukan trik yang sama di Docker Hub?
Marcel Hernandez
Tidak yang saya tahu. Anda bisa mendorong gambar ke registri daripada menggunakan build otomatis.
Boedy
2
@ eduncan911 Saya tidak berpikir ini sudah usang pada saat saya menulis komentar saya. Mereka mungkin berubah pikiran sejak saat itu? Jika saya salah, dapatkah Anda menautkan ke dokumentasi di mana dikatakan sudah usang. Terima kasih!
omninonsense
6
-f tampaknya tidak ditinggalkan menurut dokumen -> Tentukan Dockerfile (-f) : docs.docker.com/engine/reference/commandline/build/…
Ray
6
@ eduncan911 dapatkah Anda menghapus komentar karena tampaknya tidak usang? Saya melewatkan jawaban ini awalnya karena komentar Anda.
Chris Anderson
103

Sayangnya, (untuk alasan praktis dan keamanan saya kira), jika Anda ingin menambahkan / menyalin konten lokal, ia harus berada di bawah jalur root yang sama dengan Dockerfile.

Dari dokumentasi :

Path <src> harus berada di dalam konteks build; Anda tidak dapat ADD ../something / sesuatu, karena langkah pertama dari buruh pelabuhan membangun adalah mengirimkan direktori konteks (dan subdirektori) ke daemon buruh pelabuhan.

EDIT: Sekarang ada opsi ( -f) untuk mengatur jalur Dockerfile Anda; ini dapat digunakan untuk mencapai apa yang Anda inginkan, lihat tanggapan @Boedy di bawah.

mbarthelemy
sumber
22
Apakah ada solusi "bersih" untuk ini? Saya lebih suka tidak merestrukturisasi seluruh direktori proyek saya hanya untuk mengakomodasi ini.
ben_frankly
Seperti yang dikatakan oleh @ Günter, ada solusi di sini superuser.com/a/842690/136024 ... apakah ini benar-benar "bersih"? Ya setidaknya itu adalah "solusi" :)
Anthony O.
2
Lihat jawaban yang lebih baik dari @Boedy stackoverflow.com/a/34300129/2950621
nmgeek
103

Dengan docker-compose Anda dapat mengatur folder konteks:

#docker-compose.yml
version: '3.3'    
services:
      yourservice:
        build:
          context: ./
          dockerfile: ./docker/yourservice/Dockerfile
Nikita Kuznetsov
sumber
9

Menambahkan beberapa cuplikan kode untuk mendukung jawaban yang diterima.

Struktur direktori:

setup/
 |__docker/DockerFile
 |__target/scripts/<myscripts.sh>
src/
 |__<my source files>

Entri file Docker:

RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/scripts/
RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/src/
WORKDIR /home/vagrant/dockerws/chatServerInstaller

#Copy all the required files from host's file system to the container file system.
COPY setup/target/scripts/install_x.sh scripts/
COPY setup/target/scripts/install_y.sh scripts/
COPY src/ src/

Perintah yang digunakan untuk membangun citra buruh pelabuhan

docker build -t test:latest -f setup/docker/Dockerfile .
Binita Bharati
sumber
pendekatan yang bagus. Apakah mungkin membagikan kode install_x.shjuga?
Ariful Haque
4

Solusi bagi mereka yang menggunakan komposer adalah dengan menggunakan volume yang menunjuk ke folder induk:

#docker-composer.yml

foo:
  build: foo
  volumes:
    - ./:/src/:ro

Tapi saya cukup yakin bisa dilakukan bermain dengan volume di Dockerfile .

wikier
sumber
3
Tidak bisa. Catatan: Direktori host, pada dasarnya, bergantung pada host. Karena alasan ini, Anda tidak dapat memasang direktori host dari Dockerfile karena gambar yang dibuat harus portabel. Direktori host tidak akan tersedia di semua host potensial. docs.docker.com/engine/tutorials/dockervolumes/…
Peeter Kokk
4

Karena -fmenyebabkan masalah lain, saya mengembangkan solusi lain.

  • Buat gambar dasar di folder induk
  • Menambahkan file yang diperlukan.
  • Digunakan gambar ini sebagai gambar dasar untuk proyek yang dalam folder keturunan.

The -fBendera tidak memecahkan masalah saya karena saya onbuildterlihat gambar untuk file dalam folder dan memanggil seperti ini:

-f foo/bar/Dockerfile foo/bar

dari pada

-f foo/bar/Dockerfile .

Perhatikan juga bahwa ini hanya solusi untuk beberapa kasus sebagai -fflag

guneysus
sumber