1. ホーム
  2. bash

[解決済み] bash スクリプトを実行している docker エントリポイントに "permission denied" が表示される。

2022-02-26 04:50:47

質問

node.jsのアプリをDocker化しようとしています。コンテナの構築時に git clone を実行し、nodeサーバを起動します。そのため、これらの操作を.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. パーミッションが拒否されました。 まったく . したがって、適切と思われる唯一の構文は、最初の行 ("shebang") のもので、次のようになるはずです。 #!/usr/bin/env bash または #!/bin/bash など、ターゲットのファイルシステムレイアウトに依存します。

  2. ファイルシステムのパーミッションが実行できるように設定されていない可能性が高いです。また、shebang が実行可能でないものを参照している可能性もありますが、こちらは はるか の可能性は低くなります。

  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 (メタデータを保持するように明示的に文書化されている)。