在Docker容器中执行bash脚本的最佳方法是什么?

ilmyapht  于 2023-04-29  发布在  Docker
关注(0)|答案(1)|浏览(267)

我的问题是。..
我在Docker容器中有一个Flask API,这个项目的目的是废除我的学校系统,并获得所有的课程表,以便为学生生成所有可能的时间表组合。一切都很好。然而,我有一个端点,用于报废我的学校的网页的目的(我必须手动做,它的重要,以运行其他功能,消费该信息)。

我的问题是:

我创建了一个bash脚本,它向前面提到的端点发送GET请求:

#!/bin/bash

URL="http://localhost:5555/FetchGroupDataUPSite"
max_retries=3
retries=0
delay=5

echo "Sending GET request to scrapper endpoint..."

while [ $retries -lt $max_retries ]
do
  response=$(curl -s -o /dev/null -w "%{http_code}" -X GET $URL)
  if [ $response -eq 200 ]
  then
    echo "Scrapper script completed."
    break
  else
    echo "Request failed with status code $response. Retrying in $delay seconds..."
    retries=$((retries+1))
    sleep $delay
  fi
done

if [ $retries -eq $max_retries ]
then
  echo "Maximum number of retries reached. Scrapper script failed."
fi

在所有服务启动后,我每次构建docker容器时,是否可以运行bash脚本?

我也愿意听取不同方法的建议来解决这个问题(我的方法可能完全错误)
以下是我的docker-compose和Dockerfile文件,以备不时之需:

**docker-compose。联系我们

version: '3.8'
networks:
  app-tier:
    driver: bridge
services:
  db:
    image: mysql:5.7
    container_name: UP_DB
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ***
      MYSQL_PASSWORD: ***
      MYSQL_DATABASE: ***
      MYSQL_USER: ***
    command: --default-authentication-plugin=mysql_native_password --bind-address=0.0.0.0 --explicit_defaults_for_timestamp
    volumes:
      - ./sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
    networks:
      - app-tier
  adminer:
    image: adminer
    container_name: UP_Adminer
    restart: always
    ports:
      - 8080:8080
    networks:
      - app-tier
  api:
    container_name: UP_API
    stdin_open: true
    tty: true
    restart: always
    build: .
    ports:
      - 5555:5555
    volumes:
      - ./App:/SmartUP/App
    networks:
      - app-tier

Dockerfile

FROM python:3.10.7-buster
WORKDIR /SmartUP
COPY . .
ENV FLASK_ENV development
ENV DEBUG true
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get install -y wget
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable
RUN apt-get install -yqq unzip
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
# Unzip the Chrome Driver into /usr/local/bin directory
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/
# Set display port as an environment variable
ENV DISPLAY=:99

RUN pip install --upgrade pip && pip3 install -r requirements.txt
CMD ["python", "App/run.py"]

# Makes the file executable
EXPOSE 5555

提前感谢您抽出时间回答我的问题😁。

bihw5rsg

bihw5rsg1#

只需根据需要运行脚本即可。您不需要为它执行任何特定于Docker的操作。如果您在与容器相同的主机上运行它,那么当它curl http://localhost:5555/...时,它将通过其发布的ports:到达容器。
如果您希望每次重启容器堆栈时都触发此操作,则可以将其打包到脚本中

#!/bin/sh
docker-compose up --build -d
./trigger-scraper

脚本已包含重试循环。即使在容器堆栈完全正常运行之前运行脚本,您也会进入重试循环,并且在启动过程中可能第二次或第三次运行。(您可能需要等待超过15秒的时间才能使数据库容器完全可用。)

相关问题