У меня Скаффолд хорошо работает с локальным сервером разработки и развертываниями баз данных. Я пытаюсь приступить к работе с create-react-app
интерфейсом, но поведение очень медленное и неустойчивое.
Проблемы
Основные проблемы следующие:
- После запуска
skaffold dev --port-forward --tail
требуется более пяти минут, чтобы он наконец начал раскручиваться. Запуск всегоdocker build
занимает менее 30 секунд. - Когда он наконец начинает раскручиваться, он просто сидит на
Starting the development server...
еще две минуты. Затем, в девяти случаях из десяти, через несколько минут я получаю следующие ошибки (их три, потому что это количество реплик):
Один раз из десяти он действительно попадет в
Compiled Successfully! You can now view in the browser.
Но он никогда не запускается в Chrome.- Изменения JS в приложении create-react-app никогда не отражаются в новом браузере. Вы должны остановиться и снова запустить Скаффолда. Скаффолд действительно говорит
Syncing 1 files for <image>... Watching for changes...
, но ничего не меняется даже после обновления.
Что я пробовал
- Я действительно упростил то, что пытаюсь сделать, чтобы было легче разобраться в этом, поэтому я использую только приложение OOTB
create-react-app
. Несмотря на это, поведение одинаково. minikube delete
иminikube start
несколько раз (делали это, потому что даже развертывание сервера начало работать хаотично после попыткиcreate-react-app
)
Код и шаги по воспроизведению
Я использую macOS Mojave (10.14.6), использую Docker для Mac, Kubernetes (v1.16.0), minikube (v1.4.0), Skaffold (v0.39.0) и create-react-app
. Мне придется пропустить процесс установки для всего этого, так как он довольно длительный, поэтому следующие шаги предполагают, что у вас это уже установлено.
Создайте каталог проекта:
mkdir project
Создайте каталог манифеста Kubernetes и перейдите в него:
mkdir k8s && cd k8s
Сделайте
client-deployment.yaml
и добавьте следующее:apiVersion: apps/v1 kind: Deployment metadata: name: client-deployment spec: replicas: 3 selector: matchLabels: component: web template: metadata: labels: component: web spec: containers: - name: client image: testapp/client ports: - containerPort: 3000
Сделайте
client-cluster-ip-service.yaml
и добавьте следующее:apiVersion: v1 kind: Service metadata: name: client-cluster-ip-service spec: type: ClusterIP selector: component: web ports: - port: 3000 targetPort: 3000
Вернитесь к родителю:
cd ..
Создайте
skaffold.yaml
и добавьте следующее:apiVersion: skaffold/v1beta15 kind: Config build: local: push: false artifacts: - image: testapp/client context: web docker: dockerfile: Dockerfile.dev sync: manual: - src: "**/*.js" dest: . - src: "**/*.html" dest: . - src: "**/*.css" dest: . deploy: kubectl: manifests: - k8s/client-deployment.yaml - k8s/client-cluster-ip-service.yaml portForward: - resourceType: service resourceName: client-cluster-ip-service port: 3000 localPort: 3000
Начать новый
create-react-app
проект:npx create-react-app test-app
Перейдите в каталог:
cd test-app
Создайте
Dockerfile.dev
и добавьте следующее:FROM node:alpine WORKDIR '/app' EXPOSE 3000 CMD ["npm", "run", "start"] COPY package* ./ RUN npm install COPY . .
Создайте
.dockerignore
файл и добавьте следующее:node_modules *.swp
Вернитесь в родительский каталог:
cd ..
Убедитесь, что
minikube
запущен:minikube start
Запустите
skaffold.yaml
:skaffold dev --port-forward --tail
Вот что вызывает у меня проблемы.