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?


Jawaban:


225

Anda dapat membangun Dockerfile dari direktori induk:

docker build -t <some tag> -f <dir/dir/Dockerfile> .

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.


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

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 .

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 .


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.