Saya memiliki gambar buruh pelabuhan yang menginstal grunt
, tetapi ketika saya mencoba menjalankannya, saya mendapatkan kesalahan:
Error response from daemon: Cannot start container foo_1: \
exec: "grunt serve": executable file not found in $PATH
Jika saya menjalankan bash dalam mode interaktif, grunt
tersedia.
Apa yang saya lakukan salah?
Ini Dockerfile saya:
# https://registry.hub.docker.com/u/dockerfile/nodejs/ (builds on ubuntu:14.04)
FROM dockerfile/nodejs
MAINTAINER My Name, [email protected]
ENV HOME /home/web
WORKDIR /home/web/site
RUN useradd web -d /home/web -s /bin/bash -m
RUN npm install -g grunt-cli
RUN npm install -g bower
RUN chown -R web:web /home/web
USER web
RUN git clone https://github.com/repo/site /home/web/site
RUN npm install
RUN bower install --config.interactive=false --allow-root
ENV NODE_ENV development
# Port 9000 for server
# Port 35729 for livereload
EXPOSE 9000 35729
CMD ["grunt"]
CMD grunt
? Atau mungkin Anda mencoba untuk mengeksekusi perintah kasar dengan melewati path lengkap?CMD grunt?
Maksud Anda drop the["
and"]
?CMD ["grunt"]
keCMD grunt
CMD ["grunt"]
Anda menggunakan shell lain untuk menjalankan perintah, jadi di dalam shell itu $ PATH kemungkinan tidak akan disetel.Jawaban:
Ketika Anda menggunakan format exec untuk sebuah perintah (mis.
CMD ["grunt"]
, Array JSON dengan tanda kutip ganda) itu akan dieksekusi tanpa shell. Ini berarti bahwa sebagian besar variabel lingkungan tidak akan ada.Jika Anda menetapkan perintah sebagai string biasa (mis.
CMD grunt
) Maka string sesudahnyaCMD
akan dieksekusi bersama/bin/sh -c
.Info lebih lanjut tentang ini tersedia di bagian CMD dari referensi Dockerfile .
sumber
sudo set
atau(exec set)
. Itu akan gagal karena mereka menjalankan perintah tanpa shell (danset
shell builtin). Namun,sudo ls
dan(exec ls)
akan berfungsi karenals
ini adalah file biner yang sebenarnya/bin/ls
.Ini adalah hasil pertama di google ketika saya menempelkan pesan kesalahan saya, dan itu karena argumen saya tidak sesuai.
Nama wadah harus setelah semua argumen.
Buruk:
Baik:
sumber
Saya menemukan masalah yang sama. Saya melakukan yang berikut:
Ketika saya mengubahnya ke
ini bekerja dengan baik.
sumber
-v
sini.-v
adalah untuk mengikat mount volume (seperti yang dijelaskan dalamdocker run --help | grep "\-v"
), bagi saya, saya sudah menginstal/tmp
diFile Sharing
(pengaturan Docker), jadi mengapa saya harus menggunakannya lagi?Ada beberapa kemungkinan alasan untuk kesalahan seperti ini.
Dalam kasus saya, itu karena file yang dapat dieksekusi (
docker-entrypoint.sh
dari blog Ghost Dockerfile ) tidak memiliki mode file yang dapat dieksekusi setelah saya mengunduhnya.Larutan:
chmod +x docker-entrypoint.sh
sumber
Wadah Docker mungkin dibuat tanpa shell (mis. Https://github.com/fluent/fluent-bit-docker-image/issues/19 ).
Dalam hal ini, Anda dapat menyalin-di shell yang dikompilasi secara statis dan menjalankannya, misalnya
sumber
Untuk beberapa alasan, saya mendapatkan kesalahan itu kecuali jika saya menambahkan penjelas "bash". Bahkan menambahkan "#! / Bin / bash" ke bagian atas file entrypoint saya tidak membantu.
sumber
COPY
dan kemudianRUN chmod +x /compile_nibbler.sh
sebelum panggilan entrypoint.Saya memiliki masalah yang sama, Setelah banyak googling, saya tidak dapat menemukan cara memperbaikinya.
Tiba-tiba saya menyadari kesalahan bodoh saya :)
Seperti disebutkan dalam dokumen , bagian terakhir
docker run
adalah perintah yang ingin Anda jalankan dan argumennya setelah memuat wadah.BUKAN NAMA KONTAINER !!!
Itu kesalahan saya yang memalukan.
Di bawah ini saya memberi Anda gambar baris perintah saya untuk melihat apa yang telah saya lakukan salah.
Dan ini adalah perbaikan sebagaimana disebutkan dalam dokumen .
sumber
untuk membuatnya berfungsi, tambahkan referensi lunak ke / usr / bin:
ln -s $ (simpul mana) / usr / bin / simpul
ln -s $ (yang npm) / usr / bin / npm
sumber