[英]How to run Python Django and Celery using docker-compose?
[英]How do i run a shell script inside docker-compose
I have a use case in which i am trying to build a django based rest api and then use continuous integration using travis CI when changes are pushed to github. 我還使用 docker 來構建和 docker-compose 來擴展我的服務。 問題是當我將更改推送到 github 時,我想運行 pytest 和 flake8。 現在我沒有添加任何測試,因此 pytest 命令給出的退出狀態為 5。
為了解決這個問題,我嘗試創建一個腳本來執行此操作:
#!/bin/bash
pytest;
err=$? ;
if (( $err != 5 )) ;
then
exit $err;
fi
flake8 ;
但我無法讓 docker-compose 運行它。 當我使用命令運行腳本時:
docker-compose run app sh -c "run_script.sh"
它給出以下錯誤消息: sh: run_script.sh: not found
下面是我的 docker-compose yml 文件:
version: "3"
services:
app:
build:
context: .
ports:
- "8000:8000"
volumes:
- ./app:/app
command: >
sh -c "python manage.py runserver 0.0.0.0:8000"
下面是 dockerfile:
FROM python:3.7-alpine
MAINTAINER Subhayan Bhattacharya
ENV PYTHONUNBUFFERED 1
COPY Pipfile* /tmp/
RUN cd /tmp && pip install pipenv && pipenv lock --requirements > requirements.txt
RUN pip install -r /tmp/requirements.txt
RUN mkdir /app
WORKDIR /app
COPY ./app /app
RUN adduser -D user
USER user
這應該是一個簡單的問題,但我不知道如何解決這個問題。
有人可以幫我找到解決方案嗎
您的腳本不起作用,因為 Alpine 基礎映像沒有 GNU bash。 您的腳本幾乎將自身限制為POSIX Shell 命令語言; 如果這樣做,您可以將“shebang”行更改為#!/bin/sh
。
#!/bin/sh
# ^^^ not bash
pytest # individual lines don't need to end with ;
err=$?
# use [ ... ] (test), not ((...))
if [ "$err" -ne 5 ] && [ "$err" -ne 0 ]; then
exit "$err"
fi
flake8
在 CI 系統的上下文中,刪除volumes:
將本地目錄掛載到容器的/app
目錄上的行:擁有該行意味着您根本沒有測試映像中的內容,而是可能相關的主機系統上的代碼樹。
在實踐中,我建議在非 Docker 環境中運行這兩個工具。 運行它們並收集它們的結果會更簡單。 特別是像flake8
這樣的樣式檢查器對系統包或其他正在啟動的容器的依賴很少,理想情況下,您的單元測試也可以在沒有像數據庫容器那樣難以設置的上下文的情況下運行。 我建議這樣的順序:
pytest
、 flake8
和類似的測試工具。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.