docker エントリポイントで bash スクリプトを実行すると「権限が拒否されました」というエラーが表示される [重複] 質問する

docker エントリポイントで bash スクリプトを実行すると「権限が拒否されました」というエラーが表示される [重複] 質問する

私は、node.js アプリを Docker 化しようとしています。コンテナーが構築されたら、それを実行してgit cloneからノード サーバーを起動したいです。そのため、これらの操作を .sh スクリプトに入れます。そして、ENTRYPOINT でスクリプトを 1 つのコマンドとして実行します。

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 コマンドを実行する最適な方法は何ですか?

ありがとう。

ベストアンサー1

  1. 「権限が拒否されました」と表示されると、スクリプトはまったく呼び出されません。したがって、関連する可能性がある唯一の構文は、最初の行 (「シバン」) の構文であり、ターゲットのファイルシステムのレイアウトに応じて#!/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(メタデータを保持することが明示的に文書化されています) を使用することもできます。

おすすめ記事