Saya mencoba melakukan docker pada aplikasi node.js saya. Saat container dibuat, saya ingin menjalankan filegit clone
dan kemudian memulai server node. Oleh karena itu saya menempatkan operasi ini dalam skrip .sh. Dan jalankan skrip sebagai satu perintah di ENTRYPOINT:
FROM ubuntu:14.04
RUN apt-get update && apt-get install -y build-essential libssl-dev gcc curl npm git
#install gcc 4.9
RUN apt-get install -y software-properties-common python-software-properties
RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test
RUN apt-get update
RUN apt-get install -y libstdc++-4.9-dev
#install newst nodejs
RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
RUN apt-get install -y nodejs
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ADD package.json /usr/src/app/
RUN npm install
ADD docker-entrypoint.sh /usr/src/app/
EXPOSE 8080
ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"]
Docker-entrypoint.sh saya terlihat seperti ini:
git clone git@<repo>.git
git add remote upstream git@<upstream_repo>.git
/usr/bin/node server.js
Setelah membangun gambar ini dan jalankan:
docker run --env NODE_ENV=development -p 8080:8080 -t -i <image>
Saya mendapatkan:
docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.
Saya masuk ke dalam wadah dan izin dari docker-entrypoint.sh adalah:
-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh
tiga pertanyaan:
Apakah skrip bash saya memiliki sintaks yang salah?
Bagaimana cara mengubah izin file bash sebelum menambahkannya ke dalam gambar?
Apa cara terbaik untuk menjalankan beberapa perintah git di entrypoint tanpa menggunakan skrip bash?
Terima kasih.
.sh
ekstensi meninggalkan kesan yang menyesatkan tentang interpreter mana yang dapat menjalankannya. Anda mungkin mempertimbangkan untuk mengambil itu - tidak konvensional untuk perintah UNIX memiliki ekstensi (Anda tidak menjalankanls.elf
, misalnya).exec
membuat cangkang seperti itu? bukankah itu membutuhkanbash
awalan.Jawaban:
"Izin ditolak" mencegah skrip Anda dipanggil sama sekali . Jadi, satu-satunya sintaks yang mungkin relevan adalah baris pertama ("shebang"), yang akan terlihat seperti
#!/usr/bin/env bash
, atau#!/bin/bash
, atau serupa tergantung pada tata letak sistem file target Anda.Kemungkinan besar izin sistem file tidak disetel untuk mengizinkan eksekusi. Mungkin juga shebang mereferensikan sesuatu yang tidak dapat dieksekusi, tetapi kemungkinannya jauh lebih kecil.
Diperdebatkan dengan kemudahan memperbaiki masalah sebelumnya.
Pembacaan sederhana dari
... adalah bahwa skrip tidak ditandai dapat dieksekusi.
akan membahas ini di dalam wadah. Sebagai alternatif, Anda dapat memastikan bahwa salinan lokal yang direferensikan oleh Dockerfile dapat dieksekusi , lalu gunakan
COPY
(yang secara eksplisit didokumentasikan untuk menyimpan metadata).sumber
noexec
bendera, jalankanbash yourscript
bukan./yourscript
.docker build
kontainer langsung berfungsi dengan baik. Tetapi ketika saya melakukannyadocker run
, itu membuat kesalahan seperti itu. Sepertinya wadah perantara ajaib yang saya punya.File yang dapat dieksekusi harus memiliki izin untuk mengeksekusi set sebelum Anda dapat mengeksekusinya.
Di komputer tempat Anda membuat image buruh pelabuhan (bukan di dalam image buruh pelabuhan itu sendiri) coba jalankan:
Kolom pertama dari output untuk executable Anda (dalam hal ini docker-entrypoint.sh) harus memiliki bit yang dapat dieksekusi mengatur sesuatu seperti:
Jika tidak, coba:
dan kemudian buat citra buruh pelabuhan Anda lagi.
Docker menggunakan sistem filenya sendiri tetapi menyalin semuanya (termasuk bit izin) dari direktori sumber.
sumber
chmod +x docker-entrypoint.sh
di tzhe host sebenarnya adalah solusi yang disarankan, karena jauh lebih sederhana daripada mengubah fileDockerfile
.Saya menghadapi masalah yang sama & itu diselesaikan oleh
Untuk Dockerfile di pertanyaan awal seharusnya seperti ini:
sumber
sh
, mengabaikan spesifikasi penafsir shebang-nya; jadi jika itu menggunakan#!/bin/bash
, mengatakan itu ingin diinterpretasikan dengan bash, itu akan diabaikan dan itu akan diinterpretasikan dengansh
, jadi melarang fitur bahasa seperti[[ ]]
, array, dll.Jika Anda tidak menggunakan DockerFile, Anda cukup menambahkan izin sebagai argumen baris perintah bash:
sumber
Ini adalah pertanyaan lama yang ditanyakan dua tahun sebelum jawaban saya, saya akan memposting apa yang berhasil untuk saya.
Di direktori kerja saya, saya memiliki dua file: Dockerfile & provision.sh
Dockerfile:
provision.sh:
Saya dapat membuat file di kontainer buruh pelabuhan dapat dieksekusi dengan mengatur file di luar kontainer sebagai dapat dieksekusi
chmod 700 provision.sh
kemudian berjalandocker build .
.sumber