bashスクリプトを実行しているdockerエントリポイントが「許可が拒否されました」


122

私のnode.jsアプリをドッキングしようとしています。コンテナーが構築されたら、コンテナーを実行してからgit cloneノードサーバーを起動します。したがって、これらの操作を.shスクリプトに入れました。そして、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は次のようになります。

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

/usr/bin/node server.js

このイメージをビルドして実行した後:

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

私は得ています:

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

私はコンテナーにシェルし、docker-entrypoint.shの権限は次のとおりです。

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

3つの質問:

  1. bashスクリプトの構文が間違っていますか?

  2. イメージに追加する前にbashファイルの権限を変更するにはどうすればよいですか?

  3. bashスクリプトを使用せずにエントリポイントで複数のgitコマンドを実行する最良の方法は何ですか?

ありがとう。


この質問に答えられるようにするには、ファイルのアクセス許可を確認する必要があります。
Charles Duffy 2016

ところで、これがshスクリプトではなくbashスクリプトである場合、拡張機能はどのインタープリターがそれを実行できるかについて誤解を招く印象を残します。あなたはそれを取り除くことを検討するかもしれません-UNIXコマンドが拡張機能を持つことは慣習的ではありません(例えば、あなたは実行しません)。.shls.elf
Charles Duffy

私たちexecはそのように殻を作ることができますか?bashプレフィックスは必要ないでしょう。
ジャン=フランソワ・ファーブル

@Jean-FrançoisFabre、あなたの質問は正確にはどういう意味ですか?(「シェルをそのように実行する」の意味がわかりません-このコンテキストで「そのように」とは何ですか?)
Charles Duffy

2
ちなみに、ばかげた質問です。スクリプトを画像に追加する前に、スクリプトのアクセス許可は正しいですか。
Charles Duffy

回答:


183
  1. 「アクセスが拒否されました」は、スクリプトがまったく呼び出さないようにします。したがって、おそらく適切である可能性がある唯一の構文は、最初の行( "shebang")の構文であり、ターゲットのファイルシステムのレイアウトに応じて、またはのよう#!/usr/bin/env bashに見えるはずです#!/bin/bash

  2. ほとんどの場合、ファイルシステムのアクセス許可が実行を許可するように設定されていません。また、シバンが実行可能でないものを参照している可能性もありますが、その可能性ははるかに低くなります。

  3. 以前の問題を簡単に修復できることに気付きました。


の簡単な読書

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

...スクリプトが実行可能としてマークされていないことです。

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

コンテナ内でこれに対処します。または、Dockerfileによって参照されるローカルコピーが実行可能であることを確認してから使用できますCOPY(メタデータを保持するために明示的に文書化されています)。


私はあなたが正しいと思います。代わりにCOPYを使用する必要があります。しかし、bashスクリプトをコピーした後も権限を変更する必要があるようです。
Calvin Hu

コマンドに基づいて.bashスクリプトを作成し、完了したらそれらを削除するpharファイルがあります。したがって、共有ボリュームに実行許可セットを設定する必要性は、私がまだ苦労していることです。
raupie

@raupie、noexecフラグを指定してマウントポイントからスクリプトを実行する場合は、のbash yourscript代わりに実行します./yourscript
Charles Duffy、2017

1
わかりませんがdocker build、中間コンテナを実行すると問題なく動作します。しかし、私がそうするときdocker run、それはそのようなエラーを投げます。私が持っている魔法の中間コンテナのようです。
Tiina

46

実行可能ファイルを実行するには、実行可能ファイルに実行セットの権限が必要です。

(Dockerイメージ自体の内部ではなく)Dockerイメージを構築しているマシンで、次のコマンドを実行してみます。

ls -la path/to/directory

実行可能ファイル(この場合はdocker-entrypoint.sh)の出力の最初の列には、実行可能ビットが次のように設定されている必要があります。

-rwxrwxr-x

そうでない場合は、以下を試してください。

chmod +x docker-entrypoint.sh

次に、Dockerイメージを再度ビルドします。

Dockerは独自のファイルシステムを使用しますが、ソースディレクトリから(権限ビットを含む)すべてをコピーします。


13
chmod +x docker-entrypoint.shtzheホストでは、を変更するよりもはるかに簡単なので、実際に推奨されるソリューションDockerfileです。
-jotrocken

16

私は同じ問題に直面し、それによって解決されました

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

元の質問のDockerfileの場合、次のようになります。

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

5
これは回避策ですが、すばらしいものではありません。これはスクリプトをshで解釈し、そのシバンのインタープリターの仕様を無視します。それは使用していますので、場合#!/bin/bash無視され、それはして解釈されますこと、それはbashのと解釈したいと言って、shこれのような言語機能を許可しない、代わりに[[ ]]など、配列、
チャールズダフィーを

私はあなたのアプローチを使用しました、そしてそれはうまくいきました。たぶん、dos2unixでもうまくいきます
和漢短歌

1

DockerFileを使用しない場合は、bashのコマンドライン引数として権限を追加するだけです。

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

1

これは私の回答の2年前に尋ねられた古い質問です。とにかく私にとってうまくいったことを投稿します。

私の作業ディレクトリには、Dockerfileとprovision.shの2つのファイルがあります。

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

私は、実行可能なように、容器の外にファイルを設定することで、ドッキングウィンドウコンテナの実行中にファイルを作ることができたchmod 700 provision.sh後、実行されていますdocker build .

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.