Есть готовое веб-приложение react с vite базовая конфигурация. как обернуть это в докер…
- User
Есть готовое веб-приложение react с vite базовая конфигурация. как обернуть это в докер чтобы можно было ссылаться на локальные файлы, чтобы было 2 режима dev и prod в деве будет работать горячая перезагрузка, а в prod можно было открыть приложение по ссылке?
- Assistant
- Создайте файл
Dockerfileв корне проекта со следующим содержанием:
# Используем готовый образ с Node.js FROM node:16-alpine # Устанавливаем рабочую директорию WORKDIR /app # Копируем файлы в контейнер COPY . . # Устанавливаем зависимости RUN npm install # Запускаем приложение в режиме prod CMD npm run build && npm run start- Создайте файл
docker-compose.ymlсо следующим содержанием:
version: '3.8' services: app: build: . ports: - "3000:3000" volumes: - .:/app command: npm run dev-
Запустите команду
docker-compose upдля запуска приложения в режиме dev. -
Для запуска приложения в режиме prod, измените команду в
DockerfileнаCMD npm run build && npm run serve, а вdocker-compose.ymlнаcommand: npm run build && npm run start, и затем запустите командуdocker-compose up --build. -
Для доступа к локальным файлам, добавьте
volumesк сервису вdocker-compose.yml.
- Создайте файл
- User
а теперь нужно добавить api на golang, приведи простой пример api с одним post и одним get запросом, оберни это так же в докер и чтобы апи можно было запускать отдельно
- Assistant
Пример API на Go с одним POST и одним GET запросом:
package main import ( "encoding/json" "fmt" "log" "net/http" ) type Message struct { Text string `json:"text"` } var messages []Message func main() { http.HandleFunc("/messages", handleMessages) http.HandleFunc("/messages/add", handleAddMessage) log.Fatal(http.ListenAndServe(":8080", nil)) } func handleMessages(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") if r.Method == http.MethodGet { json.NewEncoder(w).Encode(messages) } else { http.Error(w, fmt.Sprintf("Unsupported method: %s", r.Method), http.StatusBadRequest) } } func handleAddMessage(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") if r.Method == http.MethodPost { var message Message err := json.NewDecoder(r.Body).Decode(&message) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } messages = append(messages, message) json.NewEncoder(w).Encode(messages) } else { http.Error(w, fmt.Sprintf("Unsupported method: %s", r.Method), http.StatusBadRequest) } }Чтобы обернуть API в Docker, создайте файл
Dockerfileсо следующим содержимым:# Используем готовый образ с Go FROM golang:1.17-alpine AS build # Устанавливаем зависимости и копируем файлы WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . # Собираем бинарник RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . # Запускаем бинарник в prod-режиме FROM alpine:3.14 WORKDIR /app COPY --from=build /app/app . ENTRYPOINT ["./app"] CMD ["-port=8080"]Создайте файл
docker-compose.yml, чтобы запустить приложение в контейнере:version: '3.8' services: api: build: . ports: - "8080:8080" volumes: - .:/app command: /app/app -port=8080Теперь можно запускать API в контейнере командой
docker-compose up api, а также изменить порт вdocker-compose.yml, если нужно использовать другой порт.