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

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

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

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

Django

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

Docker

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

Q&A

解決済

2回答

11030閲覧

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

sika

総合スコア52

bash

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

Django

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

Docker

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

0グッド

0クリップ

投稿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同様にシェルも初学者なので、自分自身もまだ深く理解できておらず、文面だけでは伝わりにくいとは思いますがお力添えして頂けると嬉しいです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

総合スコア1584

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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を修正することで無事実行できました。 懇切丁寧にご教授いただき大変感謝しております。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問