Skip to content

Commit e482c0a

Browse files
committed
Let users set the port for process-compose
1 parent ac07204 commit e482c0a

File tree

5 files changed

+52
-3
lines changed

5 files changed

+52
-3
lines changed

internal/boxcli/services.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type serviceUpFlags struct {
2020
background bool
2121
processComposeFile string
2222
processComposeFlags []string
23+
pcport int
2324
}
2425

2526
type serviceStopFlags struct {
@@ -38,6 +39,8 @@ func (flags *serviceUpFlags) register(cmd *cobra.Command) {
3839
&flags.background, "background", "b", false, "run service in background")
3940
cmd.Flags().StringArrayVar(
4041
&flags.processComposeFlags, "pcflags", []string{}, "pass flags directly to process compose")
42+
cmd.Flags().IntVarP(
43+
&flags.pcport, "pcport", "p", 0, "specify the port for process-compose to use. You can also set the pcport by exporting PC_PORT_NUM")
4144
}
4245

4346
func (flags *serviceStopFlags) register(cmd *cobra.Command) {
@@ -245,6 +248,10 @@ func startProcessManager(
245248
return err
246249
}
247250

251+
if flags.pcport < 0 {
252+
return errors.Errorf("invalid pcport %d: ports cannot be less than 0", flags.pcport)
253+
}
254+
248255
box, err := devbox.Open(&devopt.Opts{
249256
Dir: servicesFlags.config.path,
250257
Env: env,
@@ -263,6 +270,7 @@ func startProcessManager(
263270
devopt.ProcessComposeOpts{
264271
Background: flags.background,
265272
ExtraFlags: flags.processComposeFlags,
273+
PCPort: flags.pcport,
266274
},
267275
)
268276
}

internal/devbox/devopt/devboxopts.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type Opts struct {
2020
type ProcessComposeOpts struct {
2121
ExtraFlags []string
2222
Background bool
23+
PCPort int
2324
}
2425

2526
type GenerateOpts struct {

internal/devbox/services.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package devbox
33
import (
44
"context"
55
"fmt"
6+
"strconv"
67
"text/tabwriter"
78

89
"go.jetpack.io/devbox/internal/boxcli/usererr"
@@ -217,6 +218,9 @@ func (d *Devbox) StartProcessManager(
217218
for _, flag := range processComposeOpts.ExtraFlags {
218219
args = append(args, "--pcflags", flag)
219220
}
221+
if processComposeOpts.PCPort != 0 {
222+
args = append(args, "--pcport", strconv.Itoa(processComposeOpts.PCPort))
223+
}
220224

221225
return d.runDevboxServicesScript(ctx, args)
222226
}
@@ -257,6 +261,7 @@ func (d *Devbox) StartProcessManager(
257261
BinPath: processComposeBinPath,
258262
Background: processComposeOpts.Background,
259263
ExtraFlags: processComposeOpts.ExtraFlags,
264+
PCPort: processComposeOpts.PCPort,
260265
},
261266
)
262267
}

internal/services/manager.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ type ProcessComposeOpts struct {
4444
BinPath string
4545
ExtraFlags []string
4646
Background bool
47+
PCPort int
4748
}
4849

4950
func newGlobalProcessComposeConfig() *globalProcessComposeConfig {
@@ -128,10 +129,13 @@ func StartProcessManager(
128129
config := readGlobalProcessComposeJSON(configFile)
129130
config.File = configFile
130131

131-
// Get the port to use for this project
132-
port, err := getAvailablePort()
132+
port, err := selectPort(processComposeConfig.PCPort)
133133
if err != nil {
134-
return err
134+
return fmt.Errorf("failed to select port: %v", err)
135+
}
136+
137+
if !isPortAvailable(port) {
138+
return fmt.Errorf("port %d is already in use", port)
135139
}
136140

137141
// Start building the process-compose command

internal/services/ports.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package services
22

33
import (
4+
"fmt"
45
"net"
6+
"os"
7+
"strconv"
58

69
"github.com/pkg/errors"
710
)
@@ -60,6 +63,34 @@ func getAvailablePort() (int, error) {
6063
return 0, errors.New("no available port")
6164
}
6265

66+
func selectPort(configPort int) (int, error) {
67+
if configPort != 0 {
68+
return configPort, nil
69+
}
70+
71+
if portStr, exists := os.LookupEnv("PC_PORT_NUM"); exists {
72+
port, err := strconv.Atoi(portStr)
73+
if err != nil {
74+
return 0, fmt.Errorf("invalid PC_PORT_NUM environment variable: %v", err)
75+
}
76+
if port <= 0 {
77+
return 0, fmt.Errorf("invalid PC_PORT_NUM environment variable: ports cannot be less than 0")
78+
}
79+
return port, nil
80+
}
81+
82+
return getAvailablePort()
83+
}
84+
6385
func isAllowed(port int) bool {
6486
return port > 1024 && disallowedPorts[port] == ""
6587
}
88+
89+
func isPortAvailable(port int) bool {
90+
ln, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
91+
if err != nil {
92+
return false
93+
}
94+
ln.Close()
95+
return true
96+
}

0 commit comments

Comments
 (0)