Saya belajar Docker. Untuk banyak kali saya telah melihat yang Dockerfile
memiliki WORKDIR
perintah:
FROM node:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
EXPOSE 3000
CMD [ “npm”, “start” ]
Tidak bisakah saya mengabaikan WORKDIR
dan Copy
dan hanya memiliki Dockerfile
akar proyek saya? Apa kerugian menggunakan pendekatan ini?
docker
dockerfile
Le garcon
sumber
sumber
WORKDIR
Jawaban:
Menurut dokumentasi :
Selain itu, dalam praktik terbaik Docker , Anda disarankan untuk menggunakannya:
Saya akan menyarankan untuk menyimpannya.
Saya pikir Anda dapat merefaktor Dockerfile Anda menjadi seperti:
sumber
FROM ubuntu as builder
dan kemudian menggunakan gambar yang berurutanCOPY
, apakah "tahu" saya menggunakan WORKDIR dalam gambar "pembuat" atau saya harus menganggap tidak (dan menggunakan jalur absolut)?WORKDIR
nilai karena merupakan berlari instruksi dalam Dockerfile sebelum Anda menjalankanCOPY
satuRUN mkdir
Perintah Anda tidak perlu; yaitu, baris itu bisa dihapus. Sesuai dokumentasi "Jika WORKDIR tidak ada, itu akan dibuat meskipun tidak digunakan dalam instruksi Dockerfile berikutnya." - docs.docker.com/engine/reference/builder/#workdirAnda tidak perlu melakukannya
RUN mkdir -p /usr/src/app
Ini akan dibuat secara otomatis saat Anda menentukan
WORKDIR
sumber
Anda dapat menganggapnya
WORKDIR
seperticd
di dalam container (ini memengaruhi perintah yang datang nanti di Dockerfile, sepertiRUN
perintah). Jika Anda menghapusWORKDIR
dalam contoh Anda di atas,RUN npm install
tidak akan berfungsi karena Anda tidak akan berada di/usr/src/app
direktori di dalam penampung Anda.Saya tidak melihat bagaimana ini akan terkait dengan tempat Anda meletakkan Dockerfile Anda (karena lokasi Dockerfile Anda di mesin host tidak ada hubungannya dengan pwd di dalam wadah). Anda dapat meletakkan Dockerfile di mana pun Anda suka dalam proyek Anda. Namun, argumen pertama ke
COPY
adalah jalur relatif, jadi jika Anda memindahkan Dockerfile, Anda mungkin perlu memperbaruiCOPY
perintah tersebut.sumber
WORKDIR
menambahkan sukacd
, bukankah keduanyaCOPY
dalam contoh asli memiliki sumber dan tujuan yang sama?WORKDIR
Memengaruhi direktori kerja di dalam penampung . Dalam contoh asli,COPY
salinan pertama daripackage.json
pada host (jalur relatif ke Dockerfile) ke/usr/src/app/package.json
dalam penampung . Faktanya,WORKDIR
tidak berdampak pada perintah tertentu itu karena tujuan (di dalam penampung) tidak menggunakan jalur relatif (jalur dimulai dengan/
).WORKDIR
bertindak seperti acd
. Jadi, apakah 2 cuplikan di bawah ini setara?WORKDIR /usr/src/app
COPY package.json /usr/src/app/
danWORKDIR /usr/src/app
COPY package.json .
Terima kasihSebelum menerapkan WORKDIR. Di sini WORKDIR berada di tempat yang salah dan tidak digunakan dengan bijak.
Kami mengoreksi kode di atas untuk menempatkan WORKDIR di lokasi yang benar dan mengoptimalkan pernyataan berikut dengan menghapus
/Publish
sumber
Berhati-hatilah menggunakan vars sebagai nama direktori target
WORKDIR
- melakukan hal itu tampaknya menghasilkan kesalahan fatal "tidak dapat menormalkan apa pun". IMO, juga perlu ditunjukkan bahwaWORKDIR
berperilaku dengan cara yang sama sepertimkdir -p <path>
yaitu semua elemen dari jalur dibuat jika belum ada.PEMBARUAN: Saya mengalami masalah terkait variabel (disebutkan di atas) saat menjalankan build multi-tahap - sekarang tampaknya menggunakan variabel tidak masalah - jika (variabel) berada "dalam cakupan" misalnya berikut ini,
WORKDIR
referensi ke-2 gagal ...sedangkan, berhasil dalam ini ...
.oO ( Mungkin ada di dokumen & saya melewatkannya )
sumber
Berhati-hatilah saat Anda menyetelnya
WORKDIR
karena dapat memengaruhi aliran integrasi berkelanjutan. Misalnya, mengaturnya ke/home/circleci/project
akan menyebabkan kesalahan seperti.ssh
atau apa pun yang dilakukan oleh remote pada saat pengaturan.sumber