@RuslanSer

Как настроить docker* конфиги чтобы при docker-compose up файлы в контейнере заменялись на новые?

В общем имеется проект, с Django, Dockerfile и docker-compose.yml. (Конфиги будут ниже)
Когда я что то хочу поменять, то я делаю это у себя на дев сервере(python manage.py runserver), и когда закончу, захожу на сервер под ssh, копирую файлы с хоста в контейнер как то так:
docker cp ./. <container:id>:/home/app/web/.

Далее я подключаюсь в контейнер так:
docker exec -it <container_name> sh
И делаю миграции, собираю статические файлы:
python manage.py migrate
python manage.py collectstatic

И собсна всё.

А есть ли способ чтобы при поднятии контейнера (docker-compose up) сразу копировались файлы?
Т.е я через гит загрузил нужные файлы, делаю docker-compose down/docker-compose up и остается только зайти и применить миграции.

Конфиги (в докере я не особо шарю и делал по этому гайду https://testdriven.io/blog/dockerizing-django-with...):

Dockerfile
###########
# BUILDER #
###########

# pull official base image
FROM python:3.8.3-alpine as builder

# set work directory
WORKDIR /usr/src/app

# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# install psycopg2 dependencies
RUN apk add --update --no-cache g++ gcc libxslt-dev
RUN apk update \
    && apk add postgresql-dev gcc python3-dev musl-dev g++ libxslt libxslt-dev libffi-dev openssl-dev make


#RUN apk build-dep python3-lxml
#libxslt-dev libxslt py3-lxml
# lint
RUN pip install --upgrade pip
#RUN pip install flake8
COPY . .
#RUN flake8 --ignore=E501,F401 .

# install dependencies
COPY ./requirements.txt .
RUN pip wheel --no-cache-dir --no-deps --wheel-dir /usr/src/app/wheels -r requirements.txt


#########
# FINAL #
#########

# pull official base image
FROM python:3.8.3-alpine

# create directory for the app user
RUN mkdir -p /home/app

# create the app user
RUN addgroup -S app && adduser -S app -G app

# create the appropriate directories
ENV HOME=/home/app
ENV APP_HOME=/home/app/web
RUN mkdir $APP_HOME
RUN mkdir $APP_HOME/static
RUN mkdir $APP_HOME/media
WORKDIR $APP_HOME

# install dependencies
RUN apk update && apk add libpq
#Для python-docx и lxml
RUN apk add --update --no-cache --virtual .build-deps \
        g++ \
        libxml2 \
        libxml2-dev && \
    apk add libxslt-dev && \
    apk del .build-deps
COPY --from=builder /usr/src/app/wheels /wheels
COPY --from=builder /usr/src/app/requirements.txt .
RUN pip install --no-cache /wheels/*

# copy entrypoint-prod.sh
COPY ./entrypoint.prod.sh $APP_HOME

# copy project
COPY . $APP_HOME

# chown all the files to the app user
RUN chown -R app:app $APP_HOME

# change to the app user
USER app

RUN chmod +x /home/app/web/entrypoint.prod.sh
# run entrypoint.prod.sh
ENTRYPOINT ["/home/app/web/entrypoint.prod.sh"]


docker-compose.yml:
version: '3.7'

services:
  db:
    restart: always
    image: postgres:12.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=xxxx
      - POSTGRES_PASSWORD=xxxx
      - POSTGRES_DB=xxxxx
    env_file:
      - ./.env.prod
  web:
    restart: always
    build:
      context: ./
      dockerfile: Dockerfile
    command: >
      sh -c "gunicorn -w 2 -b 0.0.0.0:8000 project.wsgi:application"
    volumes:
      #python manage.py migrate
      #python manage.py collectstatic --noinput &&
      #python manage.py runserver 0.0.0.0:8000
      #- .:/home/app/web
      - static_volume:/home/app/web/static
      - media_volume:/home/app/web/media
    #ports:
    #- '8000:8000'
    expose:
      - 8000
    env_file:
      - ./.env.prod
    depends_on:
      - db
  nginx:
    restart: always
    build: ./nginx
    volumes:
      - static_volume:/home/app/web/static
      - media_volume:/home/app/web/media
    ports:
      - 80:80
    depends_on:
      - web

volumes:
  postgres_data:
  static_volume:
  media_volume:
  • Вопрос задан
  • 541 просмотр
Пригласить эксперта
Ответы на вопрос 1
@AlexandrBirukov
данные из гита хотите загрузить и в докере обновить? то есть изменения в коде подтянуть и рестартануть проект? тогда вы не тем занимаетесь, докер не для этого, самый простой вариант для автоматизации написать bash скрипт, но можно даже не заходить на сервер, а использовать fabric - очень много времени позволяет сэкономить.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы