Каков эквивалент у директивы COPY из Dockerfile в формате docker-compose без сохранения данных?
На данный момент у меня в собранном проекте один файл docker-compose.yml:
version: "3.5"
services:
front_server:
container_name: Example-Production-FrontServer
build:
context: .
dockerfile: "FrontServer.Dockerfile"
ports: [ "8080:8080" ]
depends_on: [ Database ]
Database:
# < Не имеет отношения к данному вопросу >
volumes:
- DatabaseData:/data/example.com
volumes:
DatabaseData: {}
и один Dockerfile:
FROM node:16-alpine
WORKDIR /var/www/example.com
COPY . /var/www/example.com
RUN npm install --no-package-lock
CMD [ "node", "FrontServerEntryPoint.js", "--environment", "production" ]
Я бы хотел объединить всё в один docker-compose.yaml. Может быть в будущем по мере развития проекта понадобится снова разбить создать Dockerfile-ы в добавок к docker-compose.yaml, но сейчас я хочу только docker-compose.yaml.
На сервер будет отправлено только то, что находится в папке 06-ProductionBuild:
C полями image, container_name, ports всё более менее понятно - это будет:
version: "3.5"
services:
FrontServer:
image: node:16-alpine
container_name: Jiseikan-Local-FrontServer
ports: [ "8080:8080" ]
depends_on: [ Database ]
Осталось решить, что делать с COPY
и WORKDIR
.
На словах, надо сделать следующее:
- Скопировать содержимое папки 06-ProductionBuild в контейнер.
- Произвести чистую установку зависимостей:
npm install --no-package-lock
- Запустить серверное приложение:
node FrontServerEntryPoint.js
Важно, что в случае с сервисом FrontServer мне сохранение файлов после остановки контейнера не нужно: пускай установленные зависимости безвозвратно пропадают (потому я и использовал флаг --no-package-lock
при установке зависимостей); в следующий раз я заново их установлю.
В ответе на вопрос Как настроить автоматическое удаление volum-а после остановки контейнера в Docker? мне сказали, что
Промежуточный volume удаляется вместе с удалением контейнера
Я так понял, речь идёт об этой самой скопированной папке 06-ProductionBuild и установленными зависимостями.
Напоследок приведу свой единый docker-compose.yaml для режима локальной разработки. Отличие от продакшена:
- В режиме локальной разработке используется монтирование; всё манипуляции с файлами совершаются без участия Docker
- Монтируется весь проект, а не только папка со сборкой, потому что node_modules находится в корне проекта
- В режиме локальной разработки зависимостей намного больше
version: "3.5"
services:
FrontServer:
image: node:16-alpine
container_name: Example-Local-FrontServer
ports: [ "8080:8080" ]
# [ Theory ] Nodemon will not be found if invoke just "nodemon". See https://linuxpip.org/nodemon-not-found/
# [ Theory ] About -L flag: https://github.com/remy/nodemon/issues/1802
command: sh -c "cd var/www/example.com && node_modules/.bin/nodemon -L 03-LocalDevelopmentBuild/FrontServerEntryPoint.js --environment local"
depends_on: [ Database ]
volumes:
- type: bind
source: .
target: /var/www/example.com
Database:
image: postgres
container_name: Example-Local-Database
ports:
- "${DATABASE_PORT}:${DATABASE_PORT}"
environment:
- "POSTGRES_PASSWORD=${DATABASE_PASSWORD}"
volumes:
- DatabaseData:/var/lib/postgresql/data
volumes:
DatabaseData:
name: Example-Local-DatabaseData
driver: local
И всё работает. Вот теперь мне нужно тоже самое, только
- Всё, что нужно для сервиса FrontServer, находится в папке 06-ProductionBuild.
- Зависимости нужно устанавливать с чистого листа перед каждым запуском контейнера; сохранность
node_modules
между запусками контейнеров не требуется.