Skip to content

Commit

Permalink
fix(docker-compose): omit version if schemaVersion is not provided (#…
Browse files Browse the repository at this point in the history
…3562)

The `version` element is deprecated in docker compose configs (https://github.com/compose-spec/compose-spec/blob/master/spec.md#version-and-name-top-level-elements)

This change omits `version` from the `docker-compose.yml` when `schemaVersion` isn't set. Not removing it completely to allow for backwards compatibility.

---
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
  • Loading branch information
Tucker-Eric committed May 10, 2024
1 parent e18a380 commit cbbfb4e
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 26 deletions.
7 changes: 5 additions & 2 deletions docs/api/projen.md
Original file line number Diff line number Diff line change
Expand Up @@ -9840,14 +9840,17 @@ A name to add to the docker-compose.yml filename.
```


##### `schemaVersion`<sup>Optional</sup> <a name="schemaVersion" id="projen.DockerComposeProps.property.schemaVersion"></a>
##### ~~`schemaVersion`~~<sup>Optional</sup> <a name="schemaVersion" id="projen.DockerComposeProps.property.schemaVersion"></a>

- *Deprecated:* - The top level `version` field is obsolete per the Compose Specification.
{@link https://github.com/compose-spec/compose-spec/blob/master/spec.md#version-and-name-top-level-elements Compose Specification}

```typescript
public readonly schemaVersion: string;
```

- *Type:* string
- *Default:* 3.3
- *Default:* no version is provided

Docker Compose schema version do be used.

Expand Down
6 changes: 3 additions & 3 deletions src/docker-compose/docker-compose-render.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,14 @@ interface DockerComposeFileServiceSchema {
* @internal
*/
interface DockerComposeFileSchema {
version: string;
version?: string;
services: Record<string, DockerComposeFileServiceSchema>;
volumes?: Record<string, DockerComposeVolumeConfig>;
}

export function renderDockerComposeFile(
serviceDescriptions: Record<string, DockerComposeService>,
version: string
version?: string
): object {
// Record volume configuration
const volumeConfig: Record<string, DockerComposeVolumeConfig> = {};
Expand Down Expand Up @@ -154,7 +154,7 @@ export function renderDockerComposeFile(
// Explicit with the type here because the decamelize step after this wipes
// out types.
const input: DockerComposeFileSchema = {
version,
...(version ? { version } : {}),
services,
...(Object.keys(volumeConfig).length > 0 ? { volumes: volumeConfig } : {}),
...(Object.keys(networkConfig).length > 0
Expand Down
8 changes: 5 additions & 3 deletions src/docker-compose/docker-compose.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,9 @@ export interface DockerComposeProps {

/**
* Docker Compose schema version do be used
* @default 3.3
* @default - no version is provided
* @deprecated - The top level `version` field is obsolete per the Compose Specification.
* {@link https://github.com/compose-spec/compose-spec/blob/master/spec.md#version-and-name-top-level-elements Compose Specification}
*/
readonly schemaVersion?: string;

Expand Down Expand Up @@ -155,7 +157,7 @@ export class DockerCompose extends Component {
public readonly file: YamlFile;

private readonly services: Record<string, DockerComposeService>;
private readonly version: string;
private readonly version?: string;

constructor(project: Project, props?: DockerComposeProps) {
super(project);
Expand All @@ -170,7 +172,7 @@ export class DockerCompose extends Component {
if (props?.schemaVersion && !parseFloat(props.schemaVersion)) {
throw Error("Version tag needs to be a number");
}
this.version = props?.schemaVersion ? props.schemaVersion : "3.3";
this.version = props?.schemaVersion;
this.services = {};

// Add the services provided via the constructor argument.
Expand Down
41 changes: 23 additions & 18 deletions test/docker-compose/docker-compose.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,29 @@ describe("docker-compose", () => {
assertDockerComposeFileValidates(project.outdir);
});

test("not defining schemaVersion will omit version from output", () => {
const project = new TestProject();

const dc = new DockerCompose(project, {
services: {
myservice: {
image: "nginx",
},
},
});

expect(dc._synthesizeDockerCompose()).toEqual({
services: {
myservice: {
image: "nginx",
},
},
});

project.synth();
assertDockerComposeFileValidates(project.outdir);
});

test("version tag explicit set and created as int", () => {
const project = new TestProject();

Expand Down Expand Up @@ -131,7 +154,6 @@ describe("docker-compose", () => {
});

expect(dc._synthesizeDockerCompose()).toEqual({
version: "3.3",
services: {
myservice: {
image: "nginx",
Expand Down Expand Up @@ -162,7 +184,6 @@ describe("docker-compose", () => {
});

expect(dc._synthesizeDockerCompose()).toEqual({
version: "3.3",
services: {
custom: {
build: {
Expand Down Expand Up @@ -211,7 +232,6 @@ describe("docker-compose", () => {
});

expect(dc._synthesizeDockerCompose()).toEqual({
version: "3.3",
services: {
alpine: {
image: "alpine",
Expand All @@ -236,7 +256,6 @@ describe("docker-compose", () => {
});

expect(dc._synthesizeDockerCompose()).toEqual({
version: "3.3",
services: {
alpine: {
image: "alpine",
Expand All @@ -261,7 +280,6 @@ describe("docker-compose", () => {
});

expect(dc._synthesizeDockerCompose()).toEqual({
version: "3.3",
services: {
alpine: {
image: "alpine",
Expand All @@ -287,7 +305,6 @@ describe("docker-compose", () => {
});

expect(dc._synthesizeDockerCompose()).toEqual({
version: "3.3",
services: {
myservice: {
image: "nginx",
Expand Down Expand Up @@ -318,7 +335,6 @@ describe("docker-compose", () => {
});

expect(dc._synthesizeDockerCompose()).toEqual({
version: "3.3",
services: {
myservice: {
image: "nginx",
Expand Down Expand Up @@ -360,7 +376,6 @@ describe("docker-compose", () => {
});

expect(dc._synthesizeDockerCompose()).toEqual({
version: "3.3",
services: {
web: {
image: "nginx",
Expand Down Expand Up @@ -398,7 +413,6 @@ describe("docker-compose", () => {
service.addVolume(DockerCompose.namedVolume("html", "/var/www/html"));

expect(dc._synthesizeDockerCompose()).toEqual({
version: "3.3",
services: {
myservice: {
image: "nginx",
Expand All @@ -423,7 +437,6 @@ describe("docker-compose", () => {

describe("can map a port", () => {
const expected = {
version: "3.3",
services: {
port: {
image: "nginx",
Expand Down Expand Up @@ -489,7 +502,6 @@ describe("docker-compose", () => {

describe("can add depends_on", () => {
const expected = {
version: "3.3",
services: {
first: { image: "alpine" },
second: {
Expand Down Expand Up @@ -534,7 +546,6 @@ describe("docker-compose", () => {

describe("can add environment variables", () => {
const expected = {
version: "3.3",
services: {
www: {
image: "nginx",
Expand Down Expand Up @@ -597,7 +608,6 @@ describe("docker-compose", () => {
});

expect(dc._synthesizeDockerCompose()).toEqual({
version: "3.3",
services: {
myservice: {
image: "nginx",
Expand Down Expand Up @@ -642,7 +652,6 @@ describe("docker-compose", () => {
);

expect(dc._synthesizeDockerCompose()).toEqual({
version: "3.3",
services: {
myservice: {
image: "nginx",
Expand Down Expand Up @@ -691,7 +700,6 @@ describe("docker-compose", () => {
});

expect(dc._synthesizeDockerCompose()).toEqual({
version: "3.3",
services: {
myservice: {
image: "nginx",
Expand All @@ -716,7 +724,6 @@ describe("docker-compose", () => {
service.addLabel("my.label", "my_value");

expect(dc._synthesizeDockerCompose()).toEqual({
version: "3.3",
services: {
myservice: {
image: "nginx",
Expand Down Expand Up @@ -764,7 +771,6 @@ describe("docker-compose", () => {

describe("can create a wordpress dev env", () => {
const expected = {
version: "3.3",
services: {
setup: {
image: "alpine",
Expand Down Expand Up @@ -967,7 +973,6 @@ describe("docker-compose", () => {
});

expect(dc._synthesizeDockerCompose()).toEqual({
version: "3.3",
services: {
myservice: {
image: "nginx",
Expand Down

0 comments on commit cbbfb4e

Please sign in to comment.