Django x Postgres x Selenium x Chromedriver with 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 .파일의
command: 섹션에 작성된 명령은 로컬 터미널에서 실행하는 것과 유사해야 합니다.한 가지 유의할 점은
web와 celery가 동일한 볼륨을 공유한다는 것입니다. 둘 다 Django 코드에 액세스해야 하기 때문입니다.도커파일
이 파일의 대부분은 크롬과 크롬 드라이버를 설치하는 것입니다. 둘 다 기본
apt-get 저장소에 없으므로 다음을 수행해야 합니다.google-chrome-stable 및 chromedriver에 대한 zip 파일을 다운로드합니다.내 과거 경험에서 Ubuntu는 기본 리포지토리에
chromium 및 chromium-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를 얻는 것은 훨씬 더 복잡합니다.
이 때문입니다
호환되는 버전을 얻으려면 먼저 크롬을 다운로드하고 웹 페이지에서 호환되는 버전을 받아야 합니다.
예를 들어 살펴보겠습니다.
작성 시점(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
Reference
이 문제에 관하여(Django x Postgres x Selenium x Chromedriver with Docker), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jesuissuyaa_/django-x-postgres-x-selenium-x-chromedriver-with-docker-bgh텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)