9 Commits

Author SHA1 Message Date
b83efda648 test(assets): add depends_on as example
All checks were successful
continuous-integration/drone/push Build is passing
2023-11-25 18:21:07 +01:00
5dea30fec0 fix(domain): iterate when merging over custom configs
The normal dcmerge did not work, as the check and addition was only
possible if at least one attribute such as service, network or volume
was presentThe normal dcmerge did not work, as the check and addition
was only possible if at least one attribute such as service, network or
volume was present.

The logic was adjusted.

The logic was adjusted.
2023-11-25 18:21:07 +01:00
3d97ee0ab8 fix(lint): increase line length to 120 2023-11-25 18:21:07 +01:00
8b68c9587c feat: support depends_on 2023-11-25 18:21:07 +01:00
669ebd0f25 chore(deps): update docker.io/plugins/docker docker tag to v20.17.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-11-15 14:07:06 +00:00
8f794494a2 chore(deps): update docker.io/library/golang docker tag to v1.21.4
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-11-07 23:05:08 +00:00
8e411cc486 chore(deps): update module github.com/spf13/cobra to v1.8.0
All checks were successful
continuous-integration/drone/push Build is passing
2023-11-05 23:24:28 +01:00
d7e8970860 Merge pull request 'chore(deps): update docker.io/plugins/docker docker tag to v20.17.0' (#1) from renovate/docker.io-plugins-docker-20.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2023-10-31 02:06:11 +00:00
8603eca0b5 chore(deps): update docker.io/plugins/docker docker tag to v20.17.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-10-30 23:05:33 +00:00
11 changed files with 177 additions and 41 deletions

View File

@@ -67,7 +67,7 @@ steps:
- name: unit-test - name: unit-test
commands: commands:
- go test -v ./... - go test -v ./...
image: docker.io/library/golang:1.21.3 image: docker.io/library/golang:1.21.4
trigger: trigger:
event: event:
@@ -92,7 +92,7 @@ steps:
- name: unit-test - name: unit-test
commands: commands:
- go test -v ./... - go test -v ./...
image: docker.io/library/golang:1.21.3 image: docker.io/library/golang:1.21.4
trigger: trigger:
event: event:
@@ -123,7 +123,7 @@ steps:
image: git.cryptic.systems/volker.raschek/git:1.3.1 image: git.cryptic.systems/volker.raschek/git:1.3.1
- name: build - name: build
image: docker.io/plugins/docker:20.10.9 image: docker.io/plugins/docker:20.17.1
settings: settings:
auto_tag: false auto_tag: false
dockerfile: Dockerfile dockerfile: Dockerfile
@@ -190,7 +190,7 @@ steps:
image: git.cryptic.systems/volker.raschek/git:1.3.1 image: git.cryptic.systems/volker.raschek/git:1.3.1
- name: build - name: build
image: docker.io/plugins/docker:20.10.9 image: docker.io/plugins/docker:20.17.1
settings: settings:
auto_tag: false auto_tag: false
dockerfile: Dockerfile dockerfile: Dockerfile
@@ -257,7 +257,7 @@ steps:
image: git.cryptic.systems/volker.raschek/git:1.3.1 image: git.cryptic.systems/volker.raschek/git:1.3.1
- name: build - name: build
image: docker.io/plugins/docker:20.10.9 image: docker.io/plugins/docker:20.17.1
settings: settings:
auto_tag: false auto_tag: false
dockerfile: Dockerfile dockerfile: Dockerfile
@@ -322,7 +322,7 @@ steps:
image: git.cryptic.systems/volker.raschek/git:1.3.1 image: git.cryptic.systems/volker.raschek/git:1.3.1
- name: build - name: build
image: docker.io/plugins/docker:20.10.9 image: docker.io/plugins/docker:20.17.1
settings: settings:
auto_tag: false auto_tag: false
dockerfile: Dockerfile dockerfile: Dockerfile
@@ -506,7 +506,7 @@ steps:
image: git.cryptic.systems/volker.raschek/git:1.3.1 image: git.cryptic.systems/volker.raschek/git:1.3.1
- name: build - name: build
image: docker.io/plugins/docker:20.10.9 image: docker.io/plugins/docker:20.17.1
settings: settings:
auto_tag: true auto_tag: true
auto_tag_suffix: amd64 auto_tag_suffix: amd64
@@ -566,7 +566,7 @@ steps:
image: git.cryptic.systems/volker.raschek/git:1.3.1 image: git.cryptic.systems/volker.raschek/git:1.3.1
- name: build - name: build
image: docker.io/plugins/docker:20.10.9 image: docker.io/plugins/docker:20.17.1
settings: settings:
auto_tag: true auto_tag: true
auto_tag_suffix: arm64-v8 auto_tag_suffix: arm64-v8

View File

@@ -45,11 +45,11 @@ MD012:
# MD013/line-length - Line length # MD013/line-length - Line length
MD013: MD013:
# Number of characters # Number of characters
line_length: 80 line_length: 120
# Number of characters for headings # Number of characters for headings
heading_line_length: 80 heading_line_length: 120
# Number of characters for code blocks # Number of characters for code blocks
code_block_line_length: 80 code_block_line_length: 120
# Include code blocks # Include code blocks
code_blocks: false code_blocks: false
# Include tables # Include tables

3
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"rewrap.wrappingColumn": 120,
}

View File

@@ -1,4 +1,4 @@
FROM docker.io/library/golang:1.21.3-alpine3.18 AS build FROM docker.io/library/golang:1.21.4-alpine3.18 AS build
RUN apk add git make RUN apk add git make

View File

@@ -3,22 +3,18 @@
[![Build Status](https://drone.cryptic.systems/api/badges/volker.raschek/dcmerge/status.svg)](https://drone.cryptic.systems/volker.raschek/dcmerge) [![Build Status](https://drone.cryptic.systems/api/badges/volker.raschek/dcmerge/status.svg)](https://drone.cryptic.systems/volker.raschek/dcmerge)
[![Docker Pulls](https://img.shields.io/docker/pulls/volkerraschek/dcmerge)](https://hub.docker.com/r/volkerraschek/dcmerge) [![Docker Pulls](https://img.shields.io/docker/pulls/volkerraschek/dcmerge)](https://hub.docker.com/r/volkerraschek/dcmerge)
`dcmerge` is a small program to merge docker-compose files from multiple `dcmerge` is a small program to merge docker-compose files from multiple sources. It is available via RPM and docker.
sources. It is available via RPM and docker.
The dynamic pattern of a docker-compose file, that for example `environments` The dynamic pattern of a docker-compose file, that for example `environments` can be specified as a string slice or a
can be specified as a string slice or a list of objects is currently not list of objects is currently not supported. `dcmerge` expect a strict pattern layout. The `environments`, `ports` and
supported. `dcmerge` expect a strict pattern layout. The `environments`, `ports` `volumes` must be declared as a slice of strings.
and `volumes` must be declared as a slice of strings.
Dockercompose file can be read-in from different sources. Currently are the Dockercompose file can be read-in from different sources. Currently are the following sources supported:
following sources supported:
- File - File
- HTTP/HTTPS - HTTP/HTTPS
Furthermore, `dcmerge` support different ways to merge multiple docker-compose Furthermore, `dcmerge` support different ways to merge multiple docker-compose files.
files.
- The default merge, add missing secrets, services, networks and volumes. - The default merge, add missing secrets, services, networks and volumes.
- The existing-win merge, add and protect existing attributes. - The existing-win merge, add and protect existing attributes.
@@ -26,9 +22,8 @@ files.
## default ## default
Merge only missing secrets, services, networks and volumes without respecting Merge only missing secrets, services, networks and volumes **without respecting their attributes**. For example, when
their attributes. For example, when the service `app` is already declared, it is the service `app` is already declared, it is not possible to add the service `app` twice. The second service will be
not possible to add the service `app` twice. The second service will be
completely skipped. completely skipped.
```yaml ```yaml
@@ -68,10 +63,9 @@ services:
## existing-win ## existing-win
The existing-win merge protects existing attributes. For example there are two The existing-win merge protects existing attributes. For example there are two different docker-compose files, but booth
different docker-compose files, but booth has the same environment variable has the same environment variable `CLIENT_SECRET` defined with different values. The first declaration of the attribute
`CLIENT_SECRET` defined with different values. The first declaration of the wins and is for overwriting protected.
attribute wins and is for overwriting protected.
```yaml ```yaml
--- ---
@@ -99,9 +93,8 @@ services:
## last-win ## last-win
The last-win merge overwrite recursive existing attributes. For example there The last-win merge overwrite recursive existing attributes. For example there are two different docker-compose files,
are two different docker-compose files, but booth has the same environment but booth has the same environment variable `CLIENT_SECRET` defined with different values. The last passed
variable `CLIENT_SECRET` defined with different values. The last passed
docker-compose file which contains this environment wins. docker-compose file which contains this environment wins.
```yaml ```yaml

2
go.mod
View File

@@ -3,7 +3,7 @@ module git.cryptic.systems/volker.raschek/dcmerge
go 1.20 go 1.20
require ( require (
github.com/spf13/cobra v1.7.0 github.com/spf13/cobra v1.8.0
github.com/stretchr/testify v1.8.4 github.com/stretchr/testify v1.8.4
gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v2 v2.4.0
) )

6
go.sum
View File

@@ -1,4 +1,4 @@
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
@@ -6,8 +6,8 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=

View File

@@ -66,25 +66,25 @@ func (c *Config) ExistsVolume(name string) bool {
// Merge adds only a missing network, secret, service and volume. // Merge adds only a missing network, secret, service and volume.
func (c *Config) Merge(config *Config) { func (c *Config) Merge(config *Config) {
for name, network := range c.Networks { for name, network := range config.Networks {
if !c.ExistsNetwork(name) { if !c.ExistsNetwork(name) {
c.Networks[name] = network c.Networks[name] = network
} }
} }
for name, secret := range c.Secrets { for name, secret := range config.Secrets {
if !c.ExistsSecret(name) { if !c.ExistsSecret(name) {
c.Secrets[name] = secret c.Secrets[name] = secret
} }
} }
for name, service := range c.Services { for name, service := range config.Services {
if !c.ExistsService(name) { if !c.ExistsService(name) {
c.Services[name] = service c.Services[name] = service
} }
} }
for name, volume := range c.Volumes { for name, volume := range config.Volumes {
if !c.ExistsVolume(name) { if !c.ExistsVolume(name) {
c.Volumes[name] = volume c.Volumes[name] = volume
} }
@@ -518,6 +518,7 @@ func NewSecret() *Secret {
type Service struct { type Service struct {
CapabilitiesAdd []string `json:"cap_add,omitempty" yaml:"cap_add,omitempty"` CapabilitiesAdd []string `json:"cap_add,omitempty" yaml:"cap_add,omitempty"`
CapabilitiesDrop []string `json:"cap_drop,omitempty" yaml:"cap_drop,omitempty"` CapabilitiesDrop []string `json:"cap_drop,omitempty" yaml:"cap_drop,omitempty"`
DependsOn []string `json:"depends_on,omitempty" yaml:"depends_on,omitempty"`
Deploy *ServiceDeploy `json:"deploy,omitempty" yaml:"deploy,omitempty"` Deploy *ServiceDeploy `json:"deploy,omitempty" yaml:"deploy,omitempty"`
Environments []string `json:"environment,omitempty" yaml:"environment,omitempty"` Environments []string `json:"environment,omitempty" yaml:"environment,omitempty"`
ExtraHosts []string `json:"extra_hosts,omitempty" yaml:"extra_hosts,omitempty"` ExtraHosts []string `json:"extra_hosts,omitempty" yaml:"extra_hosts,omitempty"`
@@ -644,6 +645,7 @@ func (s *Service) Equal(equalable Equalable) bool {
default: default:
return equalSlice(s.CapabilitiesAdd, service.CapabilitiesAdd) && return equalSlice(s.CapabilitiesAdd, service.CapabilitiesAdd) &&
equalSlice(s.CapabilitiesDrop, service.CapabilitiesDrop) && equalSlice(s.CapabilitiesDrop, service.CapabilitiesDrop) &&
equalSlice(s.DependsOn, service.DependsOn) &&
s.Deploy.Equal(service.Deploy) && s.Deploy.Equal(service.Deploy) &&
equalSlice(s.Environments, service.Environments) && equalSlice(s.Environments, service.Environments) &&
equalSlice(s.ExtraHosts, service.ExtraHosts) && equalSlice(s.ExtraHosts, service.ExtraHosts) &&
@@ -675,6 +677,7 @@ func (s *Service) MergeExistingWin(service *Service) {
default: default:
s.mergeExistingWinCapabilitiesAdd(service.CapabilitiesAdd) s.mergeExistingWinCapabilitiesAdd(service.CapabilitiesAdd)
s.mergeExistingWinCapabilitiesDrop(service.CapabilitiesDrop) s.mergeExistingWinCapabilitiesDrop(service.CapabilitiesDrop)
s.mergeExistingWinDependsOn(service.DependsOn)
s.mergeExistingWinDeploy(service.Deploy) s.mergeExistingWinDeploy(service.Deploy)
s.mergeExistingWinEnvironments(service.Environments) s.mergeExistingWinEnvironments(service.Environments)
s.mergeExistingWinExtraHosts(service.ExtraHosts) s.mergeExistingWinExtraHosts(service.ExtraHosts)
@@ -708,6 +711,7 @@ func (s *Service) MergeLastWin(service *Service) {
default: default:
s.mergeLastWinCapabilitiesAdd(service.CapabilitiesAdd) s.mergeLastWinCapabilitiesAdd(service.CapabilitiesAdd)
s.mergeLastWinCapabilitiesDrop(service.CapabilitiesDrop) s.mergeLastWinCapabilitiesDrop(service.CapabilitiesDrop)
s.mergeLastWinDependsOn(service.DependsOn)
s.mergeLastWinDeploy(service.Deploy) s.mergeLastWinDeploy(service.Deploy)
s.mergeLastWinEnvironments(service.Environments) s.mergeLastWinEnvironments(service.Environments)
s.mergeLastWinExtraHosts(service.ExtraHosts) s.mergeLastWinExtraHosts(service.ExtraHosts)
@@ -737,6 +741,14 @@ func (s *Service) mergeExistingWinCapabilitiesDrop(capabilitiesDrop []string) {
} }
} }
func (s *Service) mergeExistingWinDependsOn(dependsOn []string) {
for _, depOn := range dependsOn {
if !existsInSlice(s.DependsOn, depOn) && len(depOn) > 0 {
s.DependsOn = append(s.DependsOn, depOn)
}
}
}
func (s *Service) mergeExistingWinDeploy(deploy *ServiceDeploy) { func (s *Service) mergeExistingWinDeploy(deploy *ServiceDeploy) {
switch { switch {
case s.Deploy == nil && deploy != nil: case s.Deploy == nil && deploy != nil:
@@ -913,12 +925,24 @@ func (s *Service) mergeLastWinCapabilitiesDrop(capabilitiesDrop []string) {
continue continue
} }
if !existsInSlice(s.CapabilitiesAdd, capabilityDrop) { if !existsInSlice(s.CapabilitiesDrop, capabilityDrop) {
s.CapabilitiesDrop = append(s.CapabilitiesDrop, capabilityDrop) s.CapabilitiesDrop = append(s.CapabilitiesDrop, capabilityDrop)
} }
} }
} }
func (s *Service) mergeLastWinDependsOn(dependsOn []string) {
for _, dep := range dependsOn {
if len(dep) <= 0 {
continue
}
if !existsInSlice(s.DependsOn, dep) {
s.DependsOn = append(s.DependsOn, dep)
}
}
}
func (s *Service) mergeLastWinDeploy(deploy *ServiceDeploy) { func (s *Service) mergeLastWinDeploy(deploy *ServiceDeploy) {
switch { switch {
case s.Deploy == nil && deploy != nil: case s.Deploy == nil && deploy != nil:

View File

@@ -225,6 +225,7 @@ func TestService_Equal(t *testing.T) {
equalableA: &dockerCompose.Service{ equalableA: &dockerCompose.Service{
CapabilitiesAdd: []string{}, CapabilitiesAdd: []string{},
CapabilitiesDrop: []string{}, CapabilitiesDrop: []string{},
DependsOn: []string{},
Deploy: nil, Deploy: nil,
Environments: []string{}, Environments: []string{},
ExtraHosts: []string{}, ExtraHosts: []string{},
@@ -239,6 +240,7 @@ func TestService_Equal(t *testing.T) {
equalableB: &dockerCompose.Service{ equalableB: &dockerCompose.Service{
CapabilitiesAdd: []string{}, CapabilitiesAdd: []string{},
CapabilitiesDrop: []string{}, CapabilitiesDrop: []string{},
DependsOn: []string{},
Deploy: nil, Deploy: nil,
Environments: []string{}, Environments: []string{},
ExtraHosts: []string{}, ExtraHosts: []string{},
@@ -288,6 +290,24 @@ func TestService_Equal(t *testing.T) {
}, },
expectedResult: false, expectedResult: false,
}, },
{
equalableA: &dockerCompose.Service{
DependsOn: []string{"app"},
},
equalableB: &dockerCompose.Service{
DependsOn: []string{},
},
expectedResult: false,
},
{
equalableA: &dockerCompose.Service{
DependsOn: []string{"app"},
},
equalableB: &dockerCompose.Service{
DependsOn: []string{"app"},
},
expectedResult: true,
},
{ {
equalableA: &dockerCompose.Service{ equalableA: &dockerCompose.Service{
Deploy: &dockerCompose.ServiceDeploy{}, Deploy: &dockerCompose.ServiceDeploy{},
@@ -575,6 +595,52 @@ func TestService_MergeExistingWin(t *testing.T) {
}, },
}, },
// DependsOn
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{"app"},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{},
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{"app"},
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{"app"},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{"app"},
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{"app"},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{""},
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
},
},
// Deploy // Deploy
{ {
serviceDeploymentA: &dockerCompose.Service{ serviceDeploymentA: &dockerCompose.Service{
@@ -1476,6 +1542,52 @@ func TestService_MergeLastWin(t *testing.T) {
}, },
}, },
// DependsOn
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{"app"},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{},
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{"app"},
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{"app"},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{"app"},
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
},
},
{
serviceDeploymentA: &dockerCompose.Service{
DependsOn: []string{"app"},
},
serviceDeploymentB: &dockerCompose.Service{
DependsOn: []string{""},
},
expectedService: &dockerCompose.Service{
DependsOn: []string{"app"},
},
},
// Deploy // Deploy
{ {
serviceDeploymentA: &dockerCompose.Service{ serviceDeploymentA: &dockerCompose.Service{

View File

@@ -1,6 +1,8 @@
version: "3.3" version: "3.3"
services: services:
app: app:
depends_on:
- oracle
environment: environment:
- HTTP_PROXY=1.2.3.4:8080 - HTTP_PROXY=1.2.3.4:8080
image: repository:version image: repository:version

View File

@@ -1,6 +1,8 @@
version: "3.3" version: "3.3"
services: services:
app: app:
depends_on:
- postgres
environment: environment:
- HTTP_PROXY=4.3.2.1:8080 - HTTP_PROXY=4.3.2.1:8080
image: repository:version image: repository:version