web-dev-qa-db-ja.com

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

私は自分の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スクリプトを使用せずにentrypointで複数のgitコマンドを実行するための最良の方法は何ですか?

ありがとう。

68
Calvin Hu
  1. "Permission denied"はあなたのスクリプトが呼び出されないようにしますまったく。したがって、おそらく適切と思われる唯一の構文は、最初の行( "Shebang")の構文です。これは、#!/usr/bin/env bash#!/bin/bash、またはターゲットのファイルシステムのレイアウトに応じて似ているはずです。

  2. ファイルシステムの権限が実行を許可するように設定されていない可能性があります。 Shebangが実行不可能なものを参照している可能性もありますが、これはfar可能性が低いです。

  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(メタデータを保持するために明示的に文書化されています)を使用することもできます。

113
Charles Duffy

実行可能ファイルを実行するには、その実行権限がsetに設定されている必要があります。

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

ls -la path/to/directory

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

-rwxrwxr-x

そうでない場合は試してみてください。

chmod +x docker-entrypoint.sh

そして、再びdockerイメージを作ります。

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

28
Sami Start

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

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

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

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

DockerFileを使用しない場合は、単純に権限をbashのコマンドライン引数として追加できます。

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

これは、私の答えの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 .を実行することで、Dockerコンテナー内のファイルを実行可能にすることができました。

0
BradChesney79