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.)