簡體   English   中英

我如何在 docker-compose 中運行 shell 腳本

[英]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這樣的樣式檢查器對系統包或其他正在啟動的容器的依賴很少,理想情況下,您的單元測試也可以在沒有像數據庫容器那樣難以設置的上下文的情況下運行。 我建議這樣的順序:

  1. 查看源代碼。
  2. 創建一個虛擬環境並安裝其依賴項。
  3. 運行pytestflake8和類似的測試工具。
  4. 然后構建 Docker 映像,無需僅測試工具。
  5. 運行帶有各種依賴項的圖像。
  6. 根據對容器的網絡調用運行進一步的測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM