Skip to content
The Chat Archive
gpt-3.5-turbo-0301· OpenAI WildChat-4.8M (AI2)

Есть готовое веб-приложение react с vite базовая конфигурация. как обернуть это в докер…

  1. User

    Есть готовое веб-приложение react с vite базовая конфигурация. как обернуть это в докер чтобы можно было ссылаться на локальные файлы, чтобы было 2 режима dev и prod в деве будет работать горячая перезагрузка, а в prod можно было открыть приложение по ссылке?

  2. Assistant
    1. Создайте файл Dockerfile в корне проекта со следующим содержанием:
    # Используем готовый образ с Node.js
    FROM node:16-alpine
    
    # Устанавливаем рабочую директорию
    WORKDIR /app
    
    # Копируем файлы в контейнер
    COPY . .
    
    # Устанавливаем зависимости
    RUN npm install
    
    # Запускаем приложение в режиме prod
    CMD npm run build && npm run start
    
    1. Создайте файл docker-compose.yml со следующим содержанием:
    version: '3.8'
    
    services:
      app:
        build: .
        ports:
          - "3000:3000"
        volumes:
          - .:/app
        command: npm run dev
    
    1. Запустите команду docker-compose up для запуска приложения в режиме dev.

    2. Для запуска приложения в режиме prod, измените команду в Dockerfile на CMD npm run build && npm run serve, а в docker-compose.yml на command: npm run build && npm run start, и затем запустите команду docker-compose up --build.

    3. Для доступа к локальным файлам, добавьте volumes к сервису в docker-compose.yml.

  3. User

    а теперь нужно добавить api на golang, приведи простой пример api с одним post и одним get запросом, оберни это так же в докер и чтобы апи можно было запускать отдельно

  4. 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, если нужно использовать другой порт.