From f7100d87f788e9f32bb394da153e7b1fe8002fff Mon Sep 17 00:00:00 2001 From: Phil Larson Date: Thu, 6 Feb 2025 10:43:55 -0800 Subject: [PATCH 1/2] Explicit naming for Docker containers in docker-compose files --- compose.js | 9 +++- lib/services.js | 5 +- .../test_build_named/build_things/Dockerfile | 7 +++ .../test_build_named/docker-compose.yml | 6 +++ test/compose.js | 52 +++++++++++++++++++ test/spec_helper.js | 4 +- 6 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 test/assets/test_build_named/build_things/Dockerfile create mode 100644 test/assets/test_build_named/docker-compose.yml diff --git a/compose.js b/compose.js index fad4d1d..b5d8c85 100644 --- a/compose.js +++ b/compose.js @@ -13,18 +13,23 @@ class Compose { constructor(dockerode, file, projectName) { this.docker = dockerode; - if (file === undefined || projectName === undefined) { + if (file === undefined) { throw new Error('please specify a file and a project name'); } this.file = file; - this.projectName = projectName; try { this.recipe = yaml.load(fs.readFileSync(file, 'utf8')); } catch (e) { throw e; } + + this.projectName = this.recipe.name || projectName; + + if (this.projectName === undefined) { + throw new Error('please specify a file and a project name'); + } } async down(options) { diff --git a/lib/services.js b/lib/services.js index fe8ba29..33ace22 100644 --- a/lib/services.js +++ b/lib/services.js @@ -8,7 +8,8 @@ async function down(docker, projectName, recipe, output, options) { var services = []; var serviceNames = tools.sortServices(recipe); for (var serviceName of serviceNames) { - let container = docker.getContainer(projectName + '_' + serviceName + '_1'); + let containerName = recipe.services[serviceName].container_name || servicesTools.getContainerName(projectName, serviceName); + let container = docker.getContainer(containerName); try { await container.stop(); @@ -152,7 +153,7 @@ async function up(docker, projectName, recipe, output, options) { } var opts = { - name: projectName + '_' + serviceName + '_1', + name: service.container_name || servicesTools.getContainerName(projectName, serviceName), Image: service.image, HostConfig: servicesTools.buildHostConfig( projectName, diff --git a/test/assets/test_build_named/build_things/Dockerfile b/test/assets/test_build_named/build_things/Dockerfile new file mode 100644 index 0000000..d4c37fd --- /dev/null +++ b/test/assets/test_build_named/build_things/Dockerfile @@ -0,0 +1,7 @@ +FROM ubuntu + +RUN \ + apt-get update && \ + apt-get install -y nginx && service nginx start + +CMD ["bash"] \ No newline at end of file diff --git a/test/assets/test_build_named/docker-compose.yml b/test/assets/test_build_named/docker-compose.yml new file mode 100644 index 0000000..6fe1f39 --- /dev/null +++ b/test/assets/test_build_named/docker-compose.yml @@ -0,0 +1,6 @@ +name: custom_project_name + +services: + frontend: + container_name: custom_project_name_frontend + build: ./build_things \ No newline at end of file diff --git a/test/compose.js b/test/compose.js index af160d4..be30f60 100644 --- a/test/compose.js +++ b/test/compose.js @@ -4,6 +4,7 @@ const expect = require('chai').expect, var compose = require('./spec_helper').compose; var compose_complex = require('./spec_helper').compose_complex; var compose_build = require('./spec_helper').compose_build; +var compose_named = require('./spec_helper').compose_named; var docker = require('./spec_helper').docker; describe('compose', function () { @@ -169,4 +170,55 @@ describe('compose', function () { }); }); + describe('#up_build_named', function () { + it("should do compose up example with build", function (done) { + this.timeout(300000); + (async () => { + var report = await compose_named.up(); + expect(report.services).to.be.ok; + done(); + })(); + }); + it("should do compose up example with build(verbose)", function (done) { + this.timeout(300000); + (async () => { + var report = await compose_named.up({ 'verbose': true }); + expect(report.services).to.be.ok; + done(); + })(); + }); + afterEach('clean up', function (done) { + this.timeout(60000); + (async () => { + await compose_named.down({ volumes: true }); + done(); + })(); + }); + }); + + describe('#down_build_named', function () { + beforeEach('bring up', function (done) { + this.timeout(300000); + (async () => { + await compose_named.up(); + done(); + })(); + }); + it("should do compose down example with build", function (done) { + this.timeout(60000); + (async () => { + await compose_named.down({volumes: true}); + let projectName = compose_named.recipe.name || compose_named.projectName; + let listContainers = await docker.listContainers({ 'all': true, 'filters': {"label":[`com.docker.compose.project=${projectName}`]}}); + expect(listContainers).to.be.empty + let listVolumes = await docker.listVolumes({ 'filters': {"label":[`com.docker.compose.project=${projectName}`]}}) + expect(listVolumes.Volumes).to.be.empty + expect(listVolumes.Warnings).to.be.null + let listNetworks = await docker.listNetworks({ 'filters': {"label":[`com.docker.compose.project=${projectName}`]}}) + expect(listNetworks).to.be.empty + done(); + })(); + }); + }); + }); diff --git a/test/spec_helper.js b/test/spec_helper.js index 9a81b62..1d896c5 100644 --- a/test/spec_helper.js +++ b/test/spec_helper.js @@ -5,10 +5,12 @@ var docker = new Dockerode(); var compose = new DockerodeCompose(docker, './test/assets/wordpress_original.yml', 'dockerodec_wordpress'); var compose_complex = new DockerodeCompose(docker, './test/assets/complex_example/docker-compose.yml', 'dockerodec_complex'); var compose_build = new DockerodeCompose(docker, './test/assets/test_build/docker-compose.yml', 'dockerodec_build'); +var compose_named = new DockerodeCompose(docker, './test/assets/test_build_named/docker-compose.yml'); module.exports = { 'docker': docker, 'compose': compose, 'compose_complex': compose_complex, - 'compose_build': compose_build + 'compose_build': compose_build, + 'compose_named': compose_named } \ No newline at end of file From b8ceb7f13188ae961cd99b17120c9099c6ffce9b Mon Sep 17 00:00:00 2001 From: Phil Larson Date: Thu, 6 Feb 2025 11:01:28 -0800 Subject: [PATCH 2/2] Cleanup error messages --- compose.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compose.js b/compose.js index b5d8c85..7319f5f 100644 --- a/compose.js +++ b/compose.js @@ -14,7 +14,7 @@ class Compose { this.docker = dockerode; if (file === undefined) { - throw new Error('please specify a file and a project name'); + throw new Error('please specify a file'); } this.file = file; @@ -28,7 +28,7 @@ class Compose { this.projectName = this.recipe.name || projectName; if (this.projectName === undefined) { - throw new Error('please specify a file and a project name'); + throw new Error('please specify a project name'); } }