#docker #docker-compose #next.js
#docker #docker-compose #next.js
Вопрос:
Я пытаюсь создать файл Docker Compose для создания моего локального конвейера разработки и развертывания для проекта ReactJS.
Некоторый контекст: локально я запускаю сервер на 3000
порту. Для развертывания я экспортирую статические артефакты, развертываю их на S3 и делаю недействительными мои файлы CloudFront.
Я создал образ Docker, который содержит node и AWS CLI, и я использую его в качестве своего базового FROM
образа.
Dockerfile
FROM a6kme/node-aws-cli:v1
WORKDIR /app
COPY package*.json /app/
RUN npm install
EXPOSE 3000
docker-compose.yml
version: '3'
volumes:
esnextwebjourney_node_modules:
services:
esnextwebjourney:
build: .
volumes:
- .:/app
- esnextwebjourney_node_modules:/app/node_modules
ports:
- 3000:3000
command: >
sh -c "npm run build amp;amp; npm run start"
Который работает, но каждый раз, когда мне приходится продолжать и обновлять команду, либо для запуска сервера npm run build amp;amp; npm run start
, либо для развертывания его на s3 и CloudFront, т. Е. npm run build amp;amp; npm run export amp;amp; npm run deploy
.
Мой вопрос в том, могу ли я создать файл docker-compose.yml, как показано ниже, и затем я могу вызвать docker-compose run start --build
или docker-compose run deploy --build
и который будет служить обеим моим целям.
version: '3'
volumes:
esnextwebjourney_node_modules:
services:
build:
build: .
volumes:
- .:/app
- esnextwebjourney_node_modules:/app/node_modules
command: npm run build
start:
depends_on:
- build
command: npm run start
ports:
- 3000:3000
export:
depends_on:
- build
command: npm run export
deploy:
depends_on:
- export
command: npm run deploy
Ответ №1:
Вы можете создать переопределение:
docker-compose.override.yml:
version: '3'
services:
esnextwebjourney:
command: "npm run build amp;amp; npm run export amp;amp; npm run deploy"
Когда вы хотите экспортировать, вы можете запустить: docker-compose up -d —build
Когда вы хотите только развернуть: docker-compose -f docker-compose.yml up -d —build
Вторая версия игнорирует переопределение.
Другим решением было бы использовать переменную среды для команды. Таким образом, ваш docker-compose.yml всегда остается неизменным, и вам нужно только экспортировать новую переменную среды перед ее запуском. Вы можете автоматизировать это с помощью сценария оболочки.
То, что вы хотите создать, также может сработать, если вы создадите именованный том и разделите его между ВСЕМИ службами. Но мне больше нравится мое решение 🙂
Я надеюсь, что это сработает для вас.
Комментарии:
1. Привет, спасибо за ваш ответ. Я просто пытаюсь избежать создания отдельного файла компоновки для этого варианта использования. Создание файла оболочки с использованием переменной среды также звучит как взлом. Нет ли поддержки именованных команд в docker-compose, которые я могу предоставить в качестве аргумента командной строки при вызове docker-compose up?
2. Мне действительно жаль, что вы считаете создание сценария оболочки взломом… Вы могли бы перезаписать точку входа для своей службы: docker-compose run <некоторая служба> -точка входа «npm run build amp;amp; запуск npm run start». Но это означает небольшое изменение логики файла docker-compose
3. Я попробую метод —entrypoint. Но из-за отсутствия ответа, которого я ожидал, я полагаю, что это не может быть сделано так, как я думал, что это можно сделать. Тем не менее, я бы подождал какой-то иной точки зрения от других авторов. Спасибо!