Django x Postgres x Selenium x Chromedriver with Docker

18949 단어
면책 조항: 나는 Docker를 처음 사용하므로 소금 한 알과 함께 이것을 받아들이십시오. 작성 당시 이 설정은 내 컴퓨터에서 작동했습니다.

또한 제가 잘못된 부분이 있으면 댓글로 알려주세요.

파일



이러한 파일은 Dockerfile이 Django 프로젝트의 루트(즉, manage.py 와 동일한 수준)에 있다고 가정합니다.

도커파일




FROM python:3.9-slim-buster

# set environment variables
ENV PIP_DISABLE_PIP_VERSION_CHECK 1
# don't write .pyc files
ENV PYTHONDONTWRITEBYTECODE 1 
# prevent Docker from buffering stdout
ENV PYTHONUNBUFFERED 1 

# set working directory
WORKDIR /code

RUN apt-get update && apt-get install -y \
  curl \
  gnupg2 \
  unzip \
  wget

# chrome
RUN sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' \
  && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
  && apt-get update \
  && apt-get install google-chrome-stable -y

# chromedriver
RUN CHROME_VERSION="$(google-chrome --version)" \
  && export CHROMEDRIVER_RELEASE="$(echo $CHROME_VERSION | sed 's/^Google Chrome //')"  \
  && export CHROMEDRIVER_RELEASE=${CHROMEDRIVER_RELEASE%%.*} \
  && CHROMEDRIVER_VERSION=$(curl http://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROMEDRIVER_RELEASE}) \
  && curl --output /tmp/chromedriver_linux64.zip "http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip" \
  && cd /tmp \
  && unzip chromedriver_linux64.zip \
  && rm -rf chromedriver_linux64.zip \
  && mv chromedriver /usr/local/bin/chromedriver \
  && chmod +x /usr/local/bin/chromedriver \
  && cd /code

COPY ./requirements.txt .

# install dependencies
RUN apt-get update &&  apt-get install -y \
    gcc \ 
  less \
  libmagickwand-dev \
  libpq-dev \
  vim \
    && rm -rf /var/lib/apt/lists/* \
    &&  pip install -r requirements.txt

# copy project
COPY . .


docker-compose.yml




version: "3.9"
services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    environment:
      - CHROME_DRIVER_PATH=/usr/local/bin/chromedriver
    volumes:
      - .:/code  
    ports:
      - "8000:8000"
    depends_on:
      - db

  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - "POSTGRES_HOST_AUTH_METHOD=trust"

  redis:
    image: redis:alpine

  celery:
    build:
      context: .
    command: celery -A rises_ops worker -l INFO
    environment:
      - CHROME_DRIVER_PATH=/usr/local/bin/chromedriver
    volumes:
      # same volume as web
      - .:/code
    depends_on:
      - db
      - redis
      - web
volumes:
  postgres_data:


마이그레이션 스크립트



실행 후docker compose up --build 터미널에서 마이그레이션을 실행합니다.

$ docker-compose exec web python manage.py migrate


(이 작업을 수행하는 더 현명한 방법이 있을 수 있습니다. 의견에 알려주세요)

참조



실제로 도움이 된 블로그

https://learndjango.com/tutorials/django-docker-and-postgresql-tutorial
https://learndjango.com/tutorials/django-docker-and-postgresql-tutorial

디버깅 팁



# build image with no cache
$ docker build . --no-cache

# output build process to your terminal
$ docker build . --progress=plain

# re-build your services
$ docker compose up --build

# clean cache
$ docker system prune
$ docker image prune 
pg_data 볼륨은 실제로 호스트에 저장되므로 컨테이너를 삭제한 후에도 DB 데이터가 유지됩니다. DB까지 지우고,

# identify your volume
# format is project_db-data e.g. myproject_db-data
$ docker volume ls

# remove
$ docker volume rm <VOLUME ID>


참조: https://torajirousan.hatenadiary.jp/entry/2020/07/08/094325

docker-compose.yml


docker-compose.yml는 매우 간단합니다. 4가지 서비스가 있습니다: web db redis celery .
  • 웹: Django werver
  • db: PostgreSQL DB
  • redis: 셀러리 워커에서 사용되는 Redis
  • 셀러리: Django용 작업자 프로세스

  • 파일의 command: 섹션에 작성된 명령은 로컬 터미널에서 실행하는 것과 유사해야 합니다.

    한 가지 유의할 점은 webcelery가 동일한 볼륨을 공유한다는 것입니다. 둘 다 Django 코드에 액세스해야 하기 때문입니다.

    도커파일



    이 파일의 대부분은 크롬과 크롬 드라이버를 설치하는 것입니다. 둘 다 기본apt-get 저장소에 없으므로 다음을 수행해야 합니다.
  • google-chrome-stable
  • 에 대한 저장소를 추가합니다.
  • chromedriver에 대한 zip 파일을 다운로드합니다.

  • 내 과거 경험에서 Ubuntu는 기본 리포지토리에 chromiumchromium-driver가 있으므로 이미지 크기가 문제가 되지 않는 경우 더 나은 옵션이 될 수 있습니다.

    크롬



    구글 크롬 설치 과정을 설명하기 위해,

    # add the repository to the list
    RUN sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' \
    



      # add key for signed packages
      && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
    



      # don't forget to update the list after adding the repo
      && apt-get update \
      # finally install the package
      && apt-get install google-chrome-stable -y
    


    크롬드라이버



    chromedriver를 얻는 것은 훨씬 더 복잡합니다.

    이 때문입니다
  • chrome 및 chromedriver에 호환되는 버전이 있어야 함
  • 그러나 크롬 및 크롬 드라이버 버전이 항상 같지는 않음

  • 호환되는 버전을 얻으려면 먼저 크롬을 다운로드하고 웹 페이지에서 호환되는 버전을 받아야 합니다.

    예를 들어 살펴보겠습니다.

    작성 시점(2022년 9월) 현재 google-chrome의 최신 버전은 105.0.5195.102 입니다.

    $ google-chrome --version
    # Google Chrome 105.0.5195.102
    


    해당 크롬 드라이버 버전을 얻으려면 다음으로 이동하십시오.
    https://chromedriver.storage.googleapis.com/LATEST_RELEASE_105

    (크롬 버전이 80.x.x.x인 경우 대신 https://chromedriver.storage.googleapis.com/LATEST_RELEASE_80으로 이동합니다.)

    해당 chromedriver 버전이 105.0.5195.52임을 페이지에 표시됩니다.
    Dockerfile는 먼저 크롬 버전105에서 105.0.5195.102 부분을 가져와서 스크립트에서 이 작업을 수행합니다.

    # get chrome version
    RUN CHROME_VERSION="$(google-chrome --version)" \
      # remove string "Google Chrome " from the output
      && export CHROMEDRIVER_RELEASE="$(echo $CHROME_VERSION | sed 's/^Google Chrome //')"  \
      # get the major version
      # `%%` removes the longest match of the following pattern `.*`
      # so it removes `.0.5195.52` and stores `105` in the variable
      && export CHROMEDRIVER_RELEASE=${CHROMEDRIVER_RELEASE%%.*} \
    


    그런 다음 LATEST_RELEASE_ 페이지에 액세스하고 응답을 CHROMEDRIVER_VERSION 변수에 저장합니다.

    && CHROMEDRIVER_VERSION=$(curl http://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROMEDRIVER_RELEASE}) \
    # 105.0.5195.52
    # coincindentally, chrome & chromedriver versions match
    


    그런 다음 curl --output를 통해 zip을 다운로드하고 /tmp 폴더에 압축을 풉니다.

      # specify output location to /tmp/chromedriver_linux64.zip 
      && curl --output /tmp/chromedriver_linux64.zip "http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip" \
      # go to `/tmp`
      && cd /tmp \
      # unzip in `/tmp`
      && unzip chromedriver_linux64.zip \
    


    마지막으로 chromedriver를 /usr/local/bin로 이동하고 chromedriver가 실행 가능한지 확인합니다.

      # remove zip file because we don't need it anymore
      && rm -rf chromedriver_linux64.zip \
      # move executable to /usr/local/bin
      && mv chromedriver /usr/local/bin/chromedriver \
      # add permission
      && chmod +x /usr/local/bin/chromedriver \
    


    정리 단계로 WORKDIR로 다시 이동합니다.

      && cd /code
    


    함께, 우리는

    RUN CHROME_VERSION="$(google-chrome --version)" \
      && export CHROMEDRIVER_RELEASE="$(echo $CHROME_VERSION | sed 's/^Google Chrome //')"  \
      && export CHROMEDRIVER_RELEASE=${CHROMEDRIVER_RELEASE%%.*} \
      && CHROMEDRIVER_VERSION=$(curl http://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROMEDRIVER_RELEASE}) \
      && curl --output /tmp/chromedriver_linux64.zip "http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip" \
      && cd /tmp \
      && unzip chromedriver_linux64.zip \
      && rm -rf chromedriver_linux64.zip \
      && mv chromedriver /usr/local/bin/chromedriver \
      && chmod +x /usr/local/bin/chromedriver \
      && cd /code
    


    (첫 번째 섹션의 docker-compose.yml와 동일한 결과)

    참조: https://qiita.com/from_host/items/a12d75368ece7bf5bcc1

    좋은 웹페이지 즐겨찾기