Docker не должен записывать новые файлы в оригинальные каталоги - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть проект со структурой каталогов следующим образом:

docker-compose.yml
project1/
--Dockerfile
--docker-compose-entry.sh
project2/
--Dockerfile
--docker-compose-entry.sh
project3/
--Dockerfile
--docker-compose-entry.sh

Мои docker-compose-entry.sh файлы создают и записывают некоторые файлы в контейнере по мере их раскрутки.Но это делает еще одну странную вещь.Когда они записывают файлы в свои контейнеры, они также записывают файлы в исходные каталоги в моем локальном каталоге.

Я хочу, чтобы файлы записывались в контейнеры, когда они запускаются и остаются в контейнере, не затрагивая мои действительные каталоги.,Созданные файлы должны быть уничтожены, так как контейнер уничтожается.

У кого-нибудь есть предложения, как это сделать?Любая идея будет высоко оценена.

ОБНОВЛЕНИЕ Ниже приводится содержание моих файлов в соответствии с просьбой в комментариях:

# docker-compose.yml

version: '2'

services:
  project1:
    restart: always
    build: ./project1
    image: project1
    command: gunicorn project1.wsgi -b 0.0.0.0:8000
    volumes:
      - ./project1:/project1
      - ./common:/project1/common
    expose:
      - "8000"
    depends_on:
      - db
  project2:
    restart: always
    build: ./project2
    image: project2
    command: gunicorn project2.wsgi -b 0.0.0.0:8000
    volumes:
      - ./project2:/project2
      - ./common:/project2/common
    expose:
      - "8000"
    depends_on:
      - db
  project3:
    restart: always
    build: ./project3
    image: project3
    command: gunicorn project3.wsgi -b 0.0.0.0:8000
    volumes:
      - ./project3:/project3
      - ./common:/project3/common
    expose:
      - "8000"
    depends_on:
      - db
  db:
    image: postgres
    restart: always
    ports:
      - "5432:5432"
    volumes:
      - data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: sacrina
volumes:
  data:

Вот пример моего Dockerfile из проекта1.

#Dockerfile

FROM wildfish/django:node-latest

RUN mkdir /project1
WORKDIR /project1
ADD . /project1

ADD requirements.txt /project1/
ADD ./common/.bowerrc /project1/
ADD ./common/bower.json /project1/
ADD ./common/package.json /project1/
ADD ./common/gulpfile.js /project1/
ADD ./config/ /project1/

RUN pip install -r /project1/requirements.txt
RUN npm install --global bower gulp-cli

COPY ./docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entry-point.sh

ENTRYPOINT ["docker-entry-point.sh"]

Вот пример моего docker-entry-point.sh

# docker-entry-point.sh

#!/bin/sh

npm install
bower install
gulp

python manage.py collectstatic --no-input
gunicorn project1.wsgi -b 0.0.0.0:8000

1 Ответ

0 голосов
/ 28 декабря 2018

Вы неправильно используете volumes.Что вы делаете:

Сначала вы копируете все содержимое из подпапок в контейнеры на этапе сборки в youe Dockerfile: ADD . /project1.После этого у вас уже есть /project1 со всем содержимым в вашем контейнере, и вы можете использовать его.

Но затем, когда вы запускаете ваши контейнеры с помощью docker-compose, вы создаете дополнительные binding с помощью

volumes:
  - ./project2:/project2

и, таким образом, вы

1) перезаписываете свое содержимое в контейнере с помощью папки хоста.

2) разрешаете контейнеру изменять папку хоста, поскольку привязка доступна для записи (для создания только для чтения)., вы указываете - ./project2:/project2:ro

Что вам нужно сделать, это просто удалить это объявление тома из docker-compose и наслаждаться.

Кстати, если все ваши коммуникации выполняются между контейнерами в одном docker-compose и вы оставляете режим network неопределенным (по умолчанию bridge), вам не нужно явно выставлять порты, как вы делаете в

expose:
  - "8000"
...