mongodb - 如何运行 main.go 文件,而不必在容器外部单独运行它们?

标签 mongodb docker go

我有一个 main.go 文件,用于运行一个应用程序,该应用程序启动一个服务器,该服务器公开一个端口,我可以从中运行端点。我试图对它进行 dockerise 并尽可能制作保存应用程序和数据库的工作容器,但我似乎仍然必须在运行 go run main.go 后运行 docker-compose up -d

// present folder structure
.
├── cities.json // holds records of all city names
├── docker-compose.yaml 
├── dockerfile
├── go.mod
├── go.sum
├── localmon.sh // bash script that does a mongoimport to import all records from cities.json into the db
├── main.go
└── README.md

有人告诉我,我可能必须映射一个知道其所在位置的卷并执行它。另一种选择(更复杂)是 bash 脚本(或两者兼而有之?)

我有点不确定如何解决这个问题,或者我现在应该如何处理我的 compose 文件和 dockerfile。

version: '3.3'
services:
  db:
    hostname: mongo-test
    container_name: "mongo-test"
    image: mongo
    networks:
      - app_test
    ports: 
        - "8001:27017" 
    #   - "27017:27017"
    env_file: .env
    restart: unless-stopped
    volumes:
      - ".mongodata:/data/db"
  
  app: 
    hostname: app-test
    container_name: "app"
    build: 
      context: .
      dockerfile: dockerfile
    networks:
      - app_test
    ports: 
      - "54321:8080"
      # - "8080:8080"
    restart: unless-stopped
    env_file: .env

networks:
  app_test: {}
FROM golang:1.17.5-alpine3.15

RUN mkdir /app
ADD . /app
WORKDIR /app

# Copies and downloads necessary dependencies
COPY go.mod ./
COPY go.sum ./
RUN go mod download
RUN go build -o main .

# Port 8080 exposed for use
EXPOSE 8080

# Command that starts the container
CMD ["./main"]
env file that holds some DB related stuff for the main.go file to use.

DB_URI=mongodb://mongo-test:8001
CITY_DB=nht_cities
COL_USER=user
COL_CITY=city
USER_AUTH_TOKEN=50dba...
// localmon.sh

#! /bin/bash
mongoimport --host 192.168.0.101  --port 8001 --db nht_cities --collection city --type json --file ./cities.json 

运行最近的 docker-compose logs 后的 docker-compose up -d

Attaching to mongo-test, app
app    | time="2022-01-03T20:08:52Z" level=fatal msg="server selection error: context deadline exceeded, current topology: { Type: Unknown, Servers: [{ Addr: mongo-test:8001, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp 172.23.0.2:8001: connect: connection refused }, ] }"
app    | time="2022-01-03T20:09:02Z" level=fatal msg="server selection error: context deadline exceeded, current topology: { Type: Unknown, Servers: [{ Addr: mongo-test:8001, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp 172.23.0.2:8001: connect: connection refused }, ] }"
app    | time="2022-01-03T20:09:13Z" level=fatal msg="server selection error: context deadline exceeded, current topology: { Type: Unknown, Servers: [{ Addr: mongo-test:8001, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp 172.23.0.2:8001: connect: connection refused }, ] }"
app    | time="2022-01-03T20:09:24Z" level=fatal msg="server selection error: context deadline exceeded, current topology: { Type: Unknown, Servers: [{ Addr: mongo-test:8001, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp 172.23.0.2:8001: connect: connection refused }, ] }"
app    | time="2022-01-03T20:09:34Z" level=fatal msg="server selection error: context deadline exceeded, current topology: { Type: Unknown, Servers: [{ Addr: mongo-test:8001, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp 172.23.0.2:8001: connect: connection refused }, ] }"
app    | time="2022-01-03T20:09:45Z" level=fatal msg="server selection error: context deadline exceeded, current topology: { Type: Unknown, Servers: [{ Addr: mongo-test:8001, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp 172.23.0.2:8001: connect: connection refused }, ] }"
app    | time="2022-01-03T20:09:55Z" level=fatal msg="server selection error: context deadline exceeded, current topology: { Type: Unknown, Servers: [{ Addr: mongo-test:8001, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp 172.23.0.2:8001: connect: connection refused }, ] }"
app    | time="2022-01-03T20:10:06Z" level=fatal msg="server selection error: context deadline exceeded, current topology: { Type: Unknown, Servers: [{ Addr: mongo-test:8001, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp 172.23.0.2:8001: connect: connection refused }, ] }"
app    | time="2022-01-03T20:10:17Z" level=fatal msg="server selection error: context deadline exceeded, current topology: { Type: Unknown, Servers: [{ Addr: mongo-test:8001, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp 172.23.0.2:8001: connect: connection refused }, ] }"
app    | time="2022-01-03T20:10:27Z" level=fatal msg="server selection error: context deadline exceeded, current topology: { Type: Unknown, Servers: [{ Addr: mongo-test:8001, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp 172.23.0.2:8001: connect: connection refused }, ] }"
app    | time="2022-01-03T20:10:38Z" level=fatal msg="server selection error: context deadline exceeded, current topology: { Type: Unknown, Servers: [{ Addr: mongo-test:8001, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp 172.23.0.2:8001: connect: connection refused }, ] }"
app    | time="2022-01-03T20:10:48Z" level=fatal msg="server selection error: context deadline exceeded, current topology: { Type: Unknown, Servers: [{ Addr: mongo-test:8001, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp 172.23.0.2:8001: connect: connection refused }, ] }"
app    | time="2022-01-03T20:10:59Z" level=fatal msg="server selection error: context deadline exceeded, current topology: { Type: Unknown, Servers: [{ Addr: mongo-test:8001, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp 172.23.0.2:8001: connect: connection refused }, ] }"
... goes on for a bit

mongo-test | {"t":{"$date":"2022-01-03T20:08:42.360+00:00"},"s":"I",  "c":"CONTROL",  "id":23285,   "ctx":"-","msg":"Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'"}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.362+00:00"},"s":"I",  "c":"NETWORK",  "id":4915701, "ctx":"main","msg":"Initialized wire specification","attr":{"spec":{"incomingExternalClient":{"minWireVersion":0,"maxWireVersion":13},"incomingInternalClient":{"minWireVersion":0,"maxWireVersion":13},"outgoing":{"minWireVersion":0,"maxWireVersion":13},"isInternalClient":true}}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.362+00:00"},"s":"W",  "c":"ASIO",     "id":22601,   "ctx":"main","msg":"No TransportLayer configured during NetworkInterface startup"}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.362+00:00"},"s":"I",  "c":"NETWORK",  "id":4648601, "ctx":"main","msg":"Implicit TCP FastOpen unavailable. If TCP FastOpen is required, set tcpFastOpenServer, tcpFastOpenClient, and tcpFastOpenQueueSize."}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.363+00:00"},"s":"W",  "c":"ASIO",     "id":22601,   "ctx":"main","msg":"No TransportLayer configured during NetworkInterface startup"}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.363+00:00"},"s":"I",  "c":"REPL",     "id":5123008, "ctx":"main","msg":"Successfully registered PrimaryOnlyService","attr":{"service":"TenantMigrationDonorService","ns":"config.tenantMigrationDonors"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.363+00:00"},"s":"I",  "c":"REPL",     "id":5123008, "ctx":"main","msg":"Successfully registered PrimaryOnlyService","attr":{"service":"TenantMigrationRecipientService","ns":"config.tenantMigrationRecipients"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.363+00:00"},"s":"I",  "c":"CONTROL",  "id":5945603, "ctx":"main","msg":"Multi threading initialized"}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.364+00:00"},"s":"I",  "c":"CONTROL",  "id":4615611, "ctx":"initandlisten","msg":"MongoDB starting","attr":{"pid":1,"port":27017,"dbPath":"/data/db","architecture":"64-bit","host":"mongo-test"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.364+00:00"},"s":"I",  "c":"CONTROL",  "id":23403,   "ctx":"initandlisten","msg":"Build Info","attr":{"buildInfo":{"version":"5.0.5","gitVersion":"d65fd89df3fc039b5c55933c0f71d647a54510ae","openSSLVersion":"OpenSSL 1.1.1f  31 Mar 2020","modules":[],"allocator":"tcmalloc","environment":{"distmod":"ubuntu2004","distarch":"x86_64","target_arch":"x86_64"}}}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.364+00:00"},"s":"I",  "c":"CONTROL",  "id":51765,   "ctx":"initandlisten","msg":"Operating System","attr":{"os":{"name":"Ubuntu","version":"20.04"}}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.364+00:00"},"s":"I",  "c":"CONTROL",  "id":21951,   "ctx":"initandlisten","msg":"Options set by command line","attr":{"options":{"net":{"bindIp":"*"}}}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.365+00:00"},"s":"I",  "c":"STORAGE",  "id":22270,   "ctx":"initandlisten","msg":"Storage engine to use detected by data files","attr":{"dbpath":"/data/db","storageEngine":"wiredTiger"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.365+00:00"},"s":"I",  "c":"STORAGE",  "id":22297,   "ctx":"initandlisten","msg":"Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem","tags":["startupWarnings"]}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.365+00:00"},"s":"I",  "c":"STORAGE",  "id":22315,   "ctx":"initandlisten","msg":"Opening WiredTiger","attr":{"config":"create,cache_size=7178M,session_max=33000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),builtin_extension_config=(zstd=(compression_level=6)),file_manager=(close_idle_time=600,close_scan_interval=10,close_handle_minimum=250),statistics_log=(wait=0),verbose=[recovery_progress,checkpoint_progress,compact_progress],"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.942+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1641240522:942716][1:0x7f62a3693c80], txn-recover: [WT_VERB_RECOVERY_PROGRESS] Recovering log 9 through 10"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:42.968+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1641240522:968493][1:0x7f62a3693c80], txn-recover: [WT_VERB_RECOVERY_PROGRESS] Recovering log 10 through 10"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.010+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1641240523:10614][1:0x7f62a3693c80], txn-recover: [WT_VERB_RECOVERY_ALL] Main recovery loop: starting at 9/5120 to 10/256"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.056+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1641240523:56865][1:0x7f62a3693c80], txn-recover: [WT_VERB_RECOVERY_PROGRESS] Recovering log 9 through 10"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.084+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1641240523:84544][1:0x7f62a3693c80], txn-recover: [WT_VERB_RECOVERY_PROGRESS] Recovering log 10 through 10"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.108+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1641240523:108553][1:0x7f62a3693c80], txn-recover: [WT_VERB_RECOVERY_ALL] Set global recovery timestamp: (0, 0)"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.108+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1641240523:108603][1:0x7f62a3693c80], txn-recover: [WT_VERB_RECOVERY_ALL] Set global oldest timestamp: (0, 0)"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.110+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1641240523:110204][1:0x7f62a3693c80], WT_SESSION.checkpoint: [WT_VERB_CHECKPOINT_PROGRESS] saving checkpoint snapshot min: 1, snapshot max: 1 snapshot count: 0, oldest timestamp: (0, 0) , meta checkpoint timestamp: (0, 0) base write gen: 616"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.115+00:00"},"s":"I",  "c":"STORAGE",  "id":4795906, "ctx":"initandlisten","msg":"WiredTiger opened","attr":{"durationMillis":750}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.115+00:00"},"s":"I",  "c":"RECOVERY", "id":23987,   "ctx":"initandlisten","msg":"WiredTiger recoveryTimestamp","attr":{"recoveryTimestamp":{"$timestamp":{"t":0,"i":0}}}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.116+00:00"},"s":"I",  "c":"STORAGE",  "id":4366408, "ctx":"initandlisten","msg":"No table logging settings modifications are required for existing WiredTiger tables","attr":{"loggingEnabled":true}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.117+00:00"},"s":"I",  "c":"STORAGE",  "id":22262,   "ctx":"initandlisten","msg":"Timestamp monitor starting"}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.120+00:00"},"s":"W",  "c":"CONTROL",  "id":22120,   "ctx":"initandlisten","msg":"Access control is not enabled for the database. Read and write access to data and configuration is unrestricted","tags":["startupWarnings"]}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.123+00:00"},"s":"I",  "c":"NETWORK",  "id":4915702, "ctx":"initandlisten","msg":"Updated wire specification","attr":{"oldSpec":{"incomingExternalClient":{"minWireVersion":0,"maxWireVersion":13},"incomingInternalClient":{"minWireVersion":0,"maxWireVersion":13},"outgoing":{"minWireVersion":0,"maxWireVersion":13},"isInternalClient":true},"newSpec":{"incomingExternalClient":{"minWireVersion":0,"maxWireVersion":13},"incomingInternalClient":{"minWireVersion":13,"maxWireVersion":13},"outgoing":{"minWireVersion":13,"maxWireVersion":13},"isInternalClient":true}}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.123+00:00"},"s":"I",  "c":"STORAGE",  "id":5071100, "ctx":"initandlisten","msg":"Clearing temp directory"}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.123+00:00"},"s":"I",  "c":"CONTROL",  "id":20536,   "ctx":"initandlisten","msg":"Flow Control is enabled on this deployment"}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.124+00:00"},"s":"I",  "c":"FTDC",     "id":20625,   "ctx":"initandlisten","msg":"Initializing full-time diagnostic data capture","attr":{"dataDirectory":"/data/db/diagnostic.data"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.126+00:00"},"s":"I",  "c":"REPL",     "id":6015317, "ctx":"initandlisten","msg":"Setting new configuration state","attr":{"newState":"ConfigReplicationDisabled","oldState":"ConfigPreStart"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.126+00:00"},"s":"I",  "c":"NETWORK",  "id":23015,   "ctx":"listener","msg":"Listening on","attr":{"address":"/tmp/mongodb-27017.sock"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.127+00:00"},"s":"I",  "c":"NETWORK",  "id":23015,   "ctx":"listener","msg":"Listening on","attr":{"address":"0.0.0.0"}}
mongo-test | {"t":{"$date":"2022-01-03T20:08:43.127+00:00"},"s":"I",  "c":"NETWORK",  "id":23016,   "ctx":"listener","msg":"Waiting for connections","attr":{"port":27017,"ssl":"off"}}
mongo-test | {"t":{"$date":"2022-01-03T20:09:43.122+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"Checkpointer","msg":"WiredTiger message","attr":{"message":"[1641240583:122644][1:0x7f629ae81700], WT_SESSION.checkpoint: [WT_VERB_CHECKPOINT_PROGRESS] saving checkpoint snapshot min: 3, snapshot max: 3 snapshot count: 0, oldest timestamp: (0, 0) , meta checkpoint timestamp: (0, 0) base write gen: 616"}}
mongo-test | {"t":{"$date":"2022-01-03T20:10:43.134+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"Checkpointer","msg":"WiredTiger message","attr":{"message":"[1641240643:134518][1:0x7f629ae81700], WT_SESSION.checkpoint: [WT_VERB_CHECKPOINT_PROGRESS] saving checkpoint snapshot min: 6, snapshot max: 6 snapshot count: 0, oldest timestamp: (0, 0) , meta checkpoint timestamp: (0, 0) base write gen: 616"}}
mongo-test | {"t":{"$date":"2022-01-03T20:11:43.147+00:00"},"s":"I",  "c":"STORAGE",  "id":22430,   "ctx":"Checkpointer","msg":"WiredTiger message","attr":{"message":"[1641240703:147808][1:0x7f629ae81700], WT_SESSION.checkpoint: [WT_VERB_CHECKPOINT_PROGRESS] saving checkpoint snapshot min: 8, snapshot max: 8 snapshot count: 0, oldest timestamp: (0, 0) , meta checkpoint timestamp: (0, 0) base write gen: 616"}}
package main

import (
    "context"
    "crypto/sha256"
    "encoding/json"
    "fmt"
    "math/rand"
    "net/http"
    "os"
    "time"

    "github.com/gorilla/mux"
    "github.com/joho/godotenv"
    log "github.com/sirupsen/logrus"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/bson/primitive"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/mongo/readpref"
)

var client mongo.Client                                                                       // mongo client from setup declared globally
var characterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") // character runes used for creation of tokens

func setup() { // Setup for mongodb connection using mongo drivers. Returns client.
    clientOptions := options.Client().
        ApplyURI(os.Getenv("DB_URI"))
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    clientLocal, err := mongo.Connect(ctx, clientOptions)
    if err != nil {
        log.Fatalln(err, "This is from the first one")
    }
    err = clientLocal.Ping(ctx, readpref.Primary())
    if err != nil {
        log.Fatalln(err, "This is from the second one")
    }
    fmt.Println("MongoDB started successfully!")
    client = *clientLocal
}

// model for user endpoint
type User struct {
    Email       string `json:"email"`
    AccessToken string `json:"token"`
}

type City struct {
    Name string `bson:"name" json:"name"`
}

func main() {
    err := godotenv.Load() // Loads environment variables from .env
    if err != nil {
        log.Fatal("Error loading .env file")
    }

    setup()
    r := mux.NewRouter()
    r.Handle("/user", UserAuth(createUser)).Methods("POST")  // Route for registering new users
    r.Handle("/suggest", APIAuth(searchCity)).Methods("GET") // Route for searching cities within DB

    fmt.Println("Server running at port 8080")
    log.Fatal(http.ListenAndServe(":8080", r))

}

func createUser(w http.ResponseWriter, r *http.Request) { // POST request that takes in user details, generates an access token and inserts them into the DB
    w.Header().Add("content-type", "application/json")

    var user User
    _ = json.NewDecoder(r.Body).Decode(&user)
    userCollection := client.Database(os.Getenv("CITY_DB")).Collection(os.Getenv("COL_USER")) // Holds 'user' collection from DB
    user.AccessToken = generateToken()                                                        // Generated access token is assigned to user struct

    _, err := userCollection.InsertOne(context.Background(), user) // Details are inserted into the collection
    if err != nil {
        w.WriteHeader(http.StatusInternalServerError)
        log.Fatalln(err, "Failed to create user.")
    }
    json.NewEncoder(w).Encode(user)

}

func searchCity(w http.ResponseWriter, r *http.Request) { // GET request that takes in a url param and returns a list of cities from the DB
    w.Header().Set("Content-Type", "application/json")

    values := r.URL.Query()
    city := values["city_name"]                                                               // Assigns url param from route `/suggest?city_name=` to 'city'
    cityCollection := client.Database(os.Getenv("CITY_DB")).Collection(os.Getenv("COL_CITY")) // Holds 'city' collection from DB

    if len(city) == 0 {
        w.WriteHeader(http.StatusOK)
        w.Write([]byte(`{"Error": "City name cannot be empty!"}`))
        return
    }

    filter := bson.D{ //Regex filter for querying the input through the DB
        primitive.E{
            Key: "all_names", Value: primitive.Regex{
                Pattern: city[0], Options: "i",
            },
        },
    }

    cursor, err := cityCollection.Find(r.Context(), filter) // Query to find city is declared with cursor
    if err != nil {
        log.Fatal(err)
        w.WriteHeader(http.StatusInternalServerError)
        w.Write([]byte(`{"Error": "Could not execute cursor into query."}`))
        return
    }

    var cityList []City
    for cursor.Next(context.TODO()) { // Runs through each document entry in DB to see if regex matches
        var cities City
        err := cursor.Decode(&cities)
        if err != nil {
            log.Fatal(err)
            w.WriteHeader(http.StatusInternalServerError)
            w.Write([]byte(`{"Error": "Could not run cursor."}`))
            return
        }
        cityList = append(cityList, cities) // List of cities is appended to cityList
    }
    w.WriteHeader(http.StatusOK)
    if len(cityList) == 0 {
        w.Write([]byte(`{"cities": []}`))
        return
    }
    json.NewEncoder(w).Encode(cityList)

}

func init() {
    rand.Seed(time.Now().UnixNano()) // Creates a new seed for randomising the access token
}

func genString(n int) string { // Generates a randomised string from the character runes
    b := make([]rune, n)
    for i := range b {
        b[i] = characterRunes[rand.Intn(len(characterRunes))]
    }
    return string(b)
}

func generateToken(n ...int) string { // Generates a token for when a new user registers their details
    characters := 32

    if len(n) > 0 {
        characters = n[0]
    }

    randString := genString(characters)

    h := sha256.New()
    h.Write([]byte(randString))
    generatedToken := h.Sum(nil)

    return fmt.Sprintf("%x", generatedToken)

}

func APIAuth(endpoint func(http.ResponseWriter, *http.Request)) http.Handler { // Middleware to check if access token is contained within header when running searchCity
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        accessToken := r.Header.Get("x-api-key")

        // Checks token in db
        usersCollection := client.Database(os.Getenv("CITY_DB")).Collection(os.Getenv("COL_USER"))
        filter := bson.D{
            primitive.E{
                Key: "accesstoken", Value: accessToken,
            },
        }

        var user User
        err := usersCollection.FindOne(context.TODO(), filter).Decode(&user)
        if err != nil {
            http.Error(w, `Unauthorized access`, http.StatusUnauthorized)
        } else if len(accessToken) == 0 {
            http.Error(w, `Unauthorized access`, http.StatusUnauthorized)
        } else {
            endpoint(w, r)
        }
    })
}

func UserAuth(endpoint func(http.ResponseWriter, *http.Request)) http.Handler { // Middleware to check if user registering has appropriate auth token
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        accessToken := r.Header.Get("x-access-token")
        if len(accessToken) == 0 {
            http.Error(w, "Unauthorized access, no token", http.StatusUnauthorized)
            return
        }

        if accessToken != os.Getenv("USER_AUTH_TOKEN") {
            http.Error(w, "Unauthorized access", http.StatusUnauthorized)
            return
        }

        endpoint(w, r)
    })
}

容器正在运行的 netstat -tulpn

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      -                   
tcp        0      0 192.168.0.101:40571     0.0.0.0:*               LISTEN      3086/rygel          
tcp        0      0 127.0.0.1:5054          0.0.0.0:*               LISTEN      2967/python3        
tcp        0      0 172.17.0.1:41599        0.0.0.0:*               LISTEN      3086/rygel          
tcp        0      0 127.0.0.1:46624         0.0.0.0:*               LISTEN      2358/kited          
tcp        0      0 0.0.0.0:8001            0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:34179         0.0.0.0:*               LISTEN      3086/rygel          
tcp        0      0 172.23.0.1:39273        0.0.0.0:*               LISTEN      3086/rygel          
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:54321           0.0.0.0:*               LISTEN      -                   
tcp6       0      0 ::1:631                 :::*                    LISTEN      -                   
tcp6       0      0 :::8001                 :::*                    LISTEN      -                   
tcp6       0      0 :::5900                 :::*                    LISTEN      3083/gnome-remote-d 
tcp6       0      0 :::54321                :::*                    LISTEN      -                   
udp        0      0 127.0.0.53:53           0.0.0.0:*                           -                   
udp        0      0 172.17.0.1:41320        0.0.0.0:*                           3086/rygel          
udp        0      0 0.0.0.0:631             0.0.0.0:*                           -                   
udp        0      0 0.0.0.0:50334           0.0.0.0:*                           -                   
udp        0      0 239.255.255.250:1900    0.0.0.0:*                           3086/rygel          
udp        0      0 172.17.0.1:1900         0.0.0.0:*                           3086/rygel          
udp        0      0 239.255.255.250:1900    0.0.0.0:*                           3086/rygel          
udp        0      0 172.23.0.1:1900         0.0.0.0:*                           3086/rygel          
udp        0      0 239.255.255.250:1900    0.0.0.0:*                           3086/rygel          
udp        0      0 192.168.0.101:1900      0.0.0.0:*                           3086/rygel          
udp        0      0 239.255.255.250:1900    0.0.0.0:*                           3086/rygel          
udp        0      0 127.0.0.1:1900          0.0.0.0:*                           3086/rygel          
udp        0      0 127.0.0.1:52502         0.0.0.0:*                           3086/rygel          
udp        0      0 172.23.0.1:45184        0.0.0.0:*                           3086/rygel          
udp        0      0 192.168.0.101:53552     0.0.0.0:*                           3086/rygel          
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           -                   
udp6       0      0 :::42415                :::*                                -                   
udp6       0      0 :::5353                 :::*                                -                   

最佳答案

请更改 .env 中的以下行文件:

DB_URI=mongodb://mongo-test:8001

DB_URI=mongodb://mongo-test:27017

当您使用 docker compose up 启动容器时,容器在同一容器网络中运行。命令。这意味着您需要指定容器端口而不是主机端口。容器端口在Docker王国里永远位居第二:<host port>:<container port> .

关于mongodb - 如何运行 main.go 文件,而不必在容器外部单独运行它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70569682/

相关文章:

node.js - 如何查询 mongodb 以查找包含另一个数组中两个元素的数组

mongodb - 如何通过golang中的mgo在mongo中插入math/big.Int

docker - 如何向 docker jenkins 添加插件?

docker - 容器内容未使用 docker volume 复制到 docker 主机

google-app-engine - Go 中的数据存储区读取策略设置

go - 尝试恢复 Websocket 连接

dictionary - 从 golang 中的 channel 响应填充 map 值

mongodb - 我应该选择基于文档的数据库还是图形数据库? (MongoDB 与 Neo4j)

mongodb - 从多个进程并发访问数据库或内存文件,这可能吗?

docker - 为什么要在 Vagrant 下运行 Docker?