質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

Dockerfileでシェルスクリプトファイルの実行

sika
sika

総合スコア52

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

2回答

0グッド

0クリップ

8017閲覧

投稿2021/05/03 21:01

編集2021/05/04 05:41

現在、Djangoフレームワークの設定ファイルの「settings.py」の初期セットアップの自動設定シェルスクリプトをdockerのビルド時にまとめて実行させたいのですが
ビルド自体は成功するのですが、シェルスクリプトの実行ができません

シェルスクリプトファイル「settings.sh」

shell

1#!/bin/sh 2 3echo "setting.py設定変更" 4 5# 言語をjaに変更 6sed -i -e "s/LANGUAGE_CODE = 'en-us'/LANGUAGE_CODE = 'ja'/" ./core/settings.py 7 8# タイムゾーンをAsia/Tokyoに変更 9sed -i -e "s/TIME_ZONE = 'UTC'/TIME_ZONE = 'Asia/Tokyo'/" ./core/settings.py 10

「Dockerfile」

Dockerfile

1FROM python:3.7-alpine 2 3ENV PYTHONDONTWRITEBYTECODE 1 4ENV PYTHONUNBUFFERED 1 5 6EXPOSE 8000 7 8WORKDIR /code 9 10COPY requirements.txt /code/ 11 12RUN pip install -r requirements.txt 13 14COPY . /code/ 15 16ENTRYPOINT ["bash", "settings.sh"]

「docker-compose.yml」

docker

1version: "3.9" 2 3services: 4 5 web: 6 build: . 7 container_name: web-container 8 command: python manage.py runserver 0.0.0.0:8000 9 volumes: 10 - .:/code 11 ports: 12 - 8000:8000 13 depends_on: 14 - db 15 16 db: 17 image: postgres:11.4-alpine 18 container_name: db-container 19 volumes: 20 - postgres_data:/var/lib/postgresql/data 21 environment: 22 - POSTGRES_USER=django_db_user 23 - POSTGRES_PASSWORD=password1234 24 - POSTGRES_DB=django_db 25 26volumes: 27 postgres_data:

以下のコマンドで実行させています。

bash

1docker-compose run web django-admin startproject core . 2 3docker-compose up

docker compose logは以下の通りです。

bash

1$ new_image % docker-compose run web django-admin startproject core . 2Creating network "new_image_default" with the default driver 3Creating db-container ... done 4Creating new_image_web_run ... done 5$ new_image % docker-compose up 6Docker Compose is now in the Docker CLI, try `docker compose up` 7 8db-container is up-to-date 9Creating web-container ... done 10Attaching to db-container, web-container 11db-container | [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 12db-container | [1] LOG: listening on IPv6 address "::", port 5432 13db-container | [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" 14db-container | [21] LOG: database system was shut down at 2021-05-04 05:29:44 UTC 15db-container | [1] LOG: database system is ready to accept connections 16web-container | Watching for file changes with StatReloader 17web-container | Performing system checks... 18web-container | 19web-container | System check identified no issues (0 silenced). 20web-container | 21web-container | You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. 22web-container | Run 'python manage.py migrate' to apply them. 23web-container | May 04, 2021 - 05:30:34 24web-container | Django version 3.2, using settings 'core.settings' 25web-container | Starting development server at http://0.0.0.0:8000/ 26web-container | Quit the server with CONTROL-C.

Dockerfileの記述の問題とは思うのですが、docker同様にシェルも初学者なので、自分自身もまだ深く理解できておらず、文面だけでは伝わりにくいとは思いますがお力添えして頂けると嬉しいです。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

0

「docker-compose.yaml」の「command」を修正し解決しました

docker

1 command: > 2 bash -c 'bash settings.sh && 3 python manage.py runserver 0.0.0.0:8000' 4

投稿2021/05/05 05:12

sika

総合スコア52

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

ベストアンサー

おそらく画面上には「bashが見つからない」ようなメッセージが出ていると思います。

理由は、 FROM python:3.7-alpine で指定した Docker イメージ python:3.7-alpine には bash が入っていないからです。

shell

1docker container run -it python:3.7-alpine bash 2docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"bash\": executable file not found in $PATH": unknown. 3ERRO[0000] error waiting for container: context canceled

これを回避するに、は2つ方法があります。

Alpine Linux を使う理由がなければ、 Debian 10 をベースにした Python 3.7 Docker イメージを使う方法です。bash 他の環境も入っています。

Dockerfile を FROM python:3.7 に書き換えます。

あるいは、今の Dockerfile の中で ENTRYPOINT ["bash", "settings.sh"]bashshash など他のシェルに書き換える方法です。

投稿2021/05/03 21:23

編集2021/05/03 21:23
zembutsu

総合スコア1575

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

sika

2021/05/04 04:54

ご回答ありがとうございます。 bashが使えないイメージというものがあるのですね。Alpine Linuxの制限はないので `FROM python:3.7` に変更して「settings.sh」の先頭に `echo "setting.py設定変更"` を追記し、実行を確認できるようにしたのですが、やはりファイル内容の更新はされませんでした。 > ENTRYPOINT ["bash", "settings.sh"] の bash を sh や ash など他のシェルに書き換える方法 こちらも検証してみましたが、特に実行されている様子がありませんでした。 操作にはdocker for macを使っており、起動したコンテナのCLI経由での`bash settings.sh`コマンド実行では問題なく変更されるので、コンテナ環境の不整合は無いと思われるのですが他に検証すべき箇所はありますでしょうか?
zembutsu

2021/05/04 04:56

docker-compose logs コマンドを実行しますと、どのようなログがでていますか? ファイル内容の更新がされなかった、ということは、何かしら処理されたか・されなかったが確認できると思います。
sika

2021/05/04 05:38

ご返答ありがとうございます、ログを質問欄に追記しました。 まだシェルスクリプトにDjangoのデータベース設定をpostgres書き換えていない&マイグレーションコマンドをスキップしているので、そのログが出ていることは確認できるのですがsettings.shに追記したecho文字列が表示されていない&実際にブラウザでアクセスした際に日本語に変わっていないので実行はされていないと認識しております。
zembutsu

2021/05/04 06:28 編集

なるほど、そうですね、「docker-compose.yaml」の「command」命令は、「Dockerfile」の「CMD」や命令を上書きしてしまいます(参考:リファレンス https://docs.docker.com/compose/compose-file/compose-file-v3/#command )ので、 CMD 命令に書かれたスクリプトは実行されていない状態に見えます。 今回のような場合であれば、Dockerfile のなかで「RUN」命令を使って「setting.sh」を実行させたほうが良さそうな印象があります。
sika

2021/05/05 05:11

> 「docker-compose.yaml」の「command」命令は、「Dockerfile」の「CMD」や命令を上書きしてしまいます こちらをヒントにdocker-compose.yamlのcommandを修正することで無事実行できました。 懇切丁寧にご教授いただき大変感謝しております。ありがとうございました。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです