web-dev-qa-db-ja.com

Dockerfileでスクリプトを実行する

Dockerfileでビルドプロセス中にスクリプトを実行しようとしています。しかし、うまくいかないようです。

私はそのようにしてみました:

FROM php:7-fpm
ADD bootstrap.sh /
ENTRYPOINT ["/bin/bash", "/bootstrap.sh"]

またこのように:

FROM php:7-fpm    
ADD bootstrap.sh /
RUN bash -c "/bootstrap.sh"

また、実行中のコンテナを実行します。

docker exec symfony /bin/bash -c "/bootstrap.sh"

何もうまくいかないようです。

あなたはそれをする方法を知っていますか?

54
Kevin

RUNENTRYPOINTは、スクリプトを実行する2つの異なる方法です。

RUNは、中間コンテナーを作成し、スクリプトを実行し、そのコンテナーの新しい状態を新しい中間イメージで凍結することを意味します。スクリプトはそれ以降は実行されません。あなたの最終的な画像はそのスクリプトの結果を反映するはずです。

ENTRYPOINTは、(まだスクリプトを実行していない)イメージがコンテナを作成し、そのスクリプトを実行することを意味します。

どちらの場合も、スクリプトを追加する必要があります。RUN chmod +x /bootstrap.shを使用することをお勧めします。

それは Shebang#!/bin/shのように)で始まるべきです。

自分のスクリプト( KevinRaimbaud/docker-symfony/docker/php/bootstarp.sh :いくつかのgit config --globalコマンド)を考慮すると、Dockerfileでそのスクリプトを1回実行するのが最善の方法ですが、正しいユーザーを使用するようにしてください(グローバルgit構成ファイルは%HOMEです) %/。gitconfig、デフォルトでは/ rootです)

あなたのDockerfile に追加:

RUN /bootstart.sh

次に、コンテナーを実行するときに、スクリプトが実行されたことを確認するために/root/.gitconfigの内容を確認します。

73
VonC

ADDコマンドと作業ディレクトリの指定でスクリプトを作成してみてください。このように( "script"はスクリプトの名前、/root/script.shはコンテナ内の任意の場所です。別のパスにすることもできます。)

ADD script.sh /root/script.sh

この場合、ADDCMDより前にくる必要があります。BTWが1つある場合は、ホストマシンからコンテナ内の任意の場所にスクリプトをインポートするのがクールな方法です。

CMD[./script]を入れる

スクリプトが自動的に実行されます

WORKDIR/rootとして指定することもできます。そうするとコンテナを起動すると自動的にrootになります。

20
Michael

上記の回答に加えて:

Windowsで.shスクリプトファイルを作成または編集した場合は、UNIX形式の行末で保存されていることを確認してください。デフォルトでは、Windowsの多くのエディタはUnixの行末をWindows形式に変換します。Linuxはファイルの先頭でShebang(#!/ bin/sh)を認識しません。そのため、LinuxはShebangが存在しない場合のようにエラーメッセージを表示します。

ヒント:

  • Notepad ++を使用している場合は、[編集/ EOL変換/ UNIX(LF)]をクリックする必要があります。
  • あなたがVisual Studioを使用するならば、私は " End Of Line "プラグインをインストールすることを勧めます。その後、Ctrl-R、Ctrl-Wを押すことで行末を表示することができます。また、Linuxスタイルの末尾を設定するには、Ctrl-R、Ctrl-Lを押します。 Windowsスタイルの場合は、Ctrl + R、Ctrl + Cを押します。
7
VeganHunter