bash komut dosyasını çalıştıran docker giriş noktası "izin reddedildi"


122

Node.js uygulamamı dockerize etmeye çalışıyorum. Konteyner inşa edildiğinde a çalıştırmasını git cloneve ardından düğüm sunucusunu başlatmasını istiyorum . Bu nedenle bu işlemleri bir .sh betiğine koyuyorum. Ve komut dosyasını ENTRYPOINT'te tek bir komut olarak çalıştırın:

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 dosyam şöyle görünüyor:

git clone git@<repo>.git
git add remote upstream git@<upstream_repo>.git

/usr/bin/node server.js

Bu görüntüyü oluşturduktan ve çalıştırın:

docker run --env NODE_ENV=development -p 8080:8080 -t -i <image>

Ben alıyorum:

docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.

Kapsayıcıya kabuk ekliyorum ve docker-entrypoint.sh'nin izni:

-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh

üç soru:

  1. Bash betiğim yanlış sözdizimine mi sahip?

  2. Bir bash dosyasının iznini bir görüntüye eklemeden önce nasıl değiştiririm?

  3. Bir bash betiği kullanmadan giriş noktasında birden çok git komutunu çalıştırmanın en iyi yolu nedir?

Teşekkürler.


Bu soruyu cevaplayabilmek için dosya izinlerini görmemiz gerekiyor.
Charles Duffy

BTW, eğer bu bir sh betiği değil de bir bash betiğiyse , bir .shuzantı , onu hangi yorumlayıcıların çalıştırabileceği konusunda yanıltıcı bir izlenim bırakır. Bunu çıkarmayı düşünebilirsiniz - UNIX komutlarının uzantılara sahip olması geleneksel değildir ( ls.elförneğin çalıştırmazsınız ).
Charles Duffy

Bu execşekilde bir kabuk yapabilir miyiz ? bashöneke ihtiyacı olmaz mıydı .
Jean-François Fabre

@ Jean-FrançoisFabre, sorunuzla tam olarak neyi kastediyorsunuz? (Ne anlamıyorum "bir kabuk exec bu şekilde" anlamına gelir - ne bu bağlamda "Bu arada o"?)
Charles Duffy

2
Bu arada saçma bir soru - siz onları resme eklemeden önce komut dosyasının izinleri doğru mu?
Charles Duffy

Yanıtlar:


185
  1. "İzin verilmedi" çağrılmasını Senaryonu engeller hiç . Böylece, muhtemelen uygun olabilir tek sözdizimi ilk gibi görünmelidir hattı ( "shebang") ait olmasıdır #!/usr/bin/env bash, ya #!/bin/bash, veya benzer hedefin dosya sistemi düzenine bağlı.

  2. Büyük olasılıkla dosya sistemi izinleri, yürütmeye izin verecek şekilde ayarlanmamıştır. Shebang'ın çalıştırılabilir olmayan bir şeye gönderme yapması da mümkündür, ancak bu çok daha az olasıdır.

  3. Önceki sorunları tamir etmenin kolaylığı ile motive oldu.


Basit okuma

docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.

... komut dosyasının yürütülebilir olarak işaretlenmemiş olmasıdır.

RUN ["chmod", "+x", "/usr/src/app/docker-entrypoint.sh"]

bunu kapsayıcı içinde ele alacaktır. Alternatif olarak, Dockerfile tarafından atıfta bulunulan yerel kopyanın çalıştırılabilir olduğundan emin olabilir ve ardından COPY(meta verileri korumak için açıkça belgelenen) kullanabilirsiniz.


Bence haklısın. Onun yerine COPY kullanmalıyım. Ama görünüşe göre bash betiğini KOPYALADıktan sonra da izni değiştirmem gerekiyor.
Calvin Hu

Bir komuta göre .bash komut dosyaları oluşturan ve tamamlandıktan sonra bunları kaldıran bir phar dosyam var. Bu nedenle, yürütme izni setine sahip olmak için paylaşılan ciltlere duyulan ihtiyaç, hala mücadele ettiğim bir şey.
raupie

@raupie, noexecbayrakla bağlama noktasından bir komut dosyası çalıştırmak istiyorsanız , bash yourscriptbunun yerine çalıştırın ./yourscript.
Charles Duffy

1
docker buildAnında konteyneri çalıştırdığımda iyi çalışıyor. Ama yaptığımda docker runböyle bir hata veriyor. Sahip olduğum sihirli bir ara konteynere benziyor.
Tiina

46

Yürütülebilir bir dosyanın çalıştırılabilmesi için önce yürütme kümesi için izinlere sahip olması gerekir.

Docker görüntüsünü oluşturduğunuz makinenizde (docker görüntüsünün içinde değil) şunu çalıştırmayı deneyin:

ls -la path/to/directory

Çalıştırılabilir dosyanızın çıktısının ilk sütunu (bu durumda docker-entrypoint.sh) çalıştırılabilir bitlerin aşağıdaki gibi ayarlamasına sahip olmalıdır:

-rwxrwxr-x

Değilse, deneyin:

chmod +x docker-entrypoint.sh

ve ardından docker görüntünüzü yeniden oluşturun.

Docker kendi dosya sistemini kullanır, ancak kaynak dizinlerden her şeyi (izin bitleri dahil) kopyalar.


13
chmod +x docker-entrypoint.shon tzhe host, aslında önerilen çözümdür, çünkü Dockerfile.
jotrocken

18

Aynı sorunla karşılaştım ve çözüldü

ENTRYPOINT ["sh", "/docker-entrypoint.sh"]

Orijinal sorudaki Dockerfile için şöyle olmalıdır:

ENTRYPOINT ["sh", "/usr/src/app/docker-entrypoint.sh"]

5
Bu bir geçici çözümdür, ancak harika bir çözüm değildir - bu, betiğin shbir yorumlayıcının shebang'ının spesifikasyonunu görmezden gelerek ile yorumlar; Kullandığı öyleyse #!/bin/bashyok sayılacak ve yorumlanmalıdır gerekenler, bash ile yorumlanmalıdır istediğini söyleyerek shböylece gibi dil özelliklerini izin vermeme, bunun yerine [[ ]], vb diziler,
Charles Duffy

Yaklaşımınızı kullandım ve işe yaradı. Belki dos2unix de işe yarar
Wakan Tanka

1

Eğer yoksa değil DockerFile kullanmak, sadece Bash komut satırı argümanı olarak izin ekleyebilirsiniz:

docker run -t <image>  /bin/bash -c "chmod +x /usr/src/app/docker-entrypoint.sh; /usr/src/app/docker-entrypoint.sh"

1

Bu, cevabımdan iki yıl önce sorulan eski bir soru, yine de benim için neyin işe yaradığını yazacağım.

Çalışma dizinimde iki dosyam var: Dockerfile & provizyon.sh

Dockerfile:

FROM centos:6.8

# put the script in the /root directory of the container
COPY provision.sh /root

# execute the script inside the container
RUN /root/provision.sh

EXPOSE 80

# Default command
CMD ["/bin/bash"]

provision.sh:

#!/usr/bin/env bash

yum upgrade

Docker konteynerindeki dosyayı, konteynerin dışındaki dosyayı yürütülebilir olarak ayarlayıp chmod 700 provision.shardından çalıştırarak yürütülebilir hale getirebildim docker build ..

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.