From e6fe17dbf7c0d151dcfde64311aed053a83ba58f Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Mon, 1 Jul 2024 14:33:06 -0700 Subject: [PATCH 1/4] Add host mapping --- .../generator/docker/DockerComposeGenerator.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/src/main/java/org/lflang/generator/docker/DockerComposeGenerator.java b/core/src/main/java/org/lflang/generator/docker/DockerComposeGenerator.java index 08b0df23c6..2ac6c9fa63 100644 --- a/core/src/main/java/org/lflang/generator/docker/DockerComposeGenerator.java +++ b/core/src/main/java/org/lflang/generator/docker/DockerComposeGenerator.java @@ -62,10 +62,20 @@ protected String getServiceDescription(DockerData data) { context: "%s" container_name: "%s" tty: true + extra_hosts: + - "host.docker.internal:host-gateway" + environment: + LF_TELEGRAF_HOST_NAME: ${LF_TELEGRAF_HOST_NAME:-host.docker.internal} """ .formatted(getServiceName(data), getBuildContext(data), getContainerName(data)); } + private String getEnvironmentFile() { + // FIXME: add target property env-files + var file = ".env"; + return "env-file: \"%s\"".formatted(file); + } + /** Return the name of the service represented by the given data. */ protected String getServiceName(DockerData data) { return "main"; From c3cab8b8d446982c0ce4d0e9d986fc4e524ef846 Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Tue, 2 Jul 2024 05:07:14 -0700 Subject: [PATCH 2/4] Support for environment files --- .../docker/DockerComposeGenerator.java | 35 +++++++++++++++---- .../target/property/DockerProperty.java | 12 +++++-- test/C/src/docker/federated/.env | 2 ++ test/C/src/docker/federated/DockerOptions.lf | 3 +- 4 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 test/C/src/docker/federated/.env diff --git a/core/src/main/java/org/lflang/generator/docker/DockerComposeGenerator.java b/core/src/main/java/org/lflang/generator/docker/DockerComposeGenerator.java index 2ac6c9fa63..876ca7c8ce 100644 --- a/core/src/main/java/org/lflang/generator/docker/DockerComposeGenerator.java +++ b/core/src/main/java/org/lflang/generator/docker/DockerComposeGenerator.java @@ -3,9 +3,11 @@ import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; +import java.nio.file.Path; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +import org.apache.commons.text.StringEscapeUtils; import org.lflang.generator.LFGeneratorContext; import org.lflang.target.property.DockerProperty; import org.lflang.util.FileUtil; @@ -65,15 +67,22 @@ protected String getServiceDescription(DockerData data) { extra_hosts: - "host.docker.internal:host-gateway" environment: - LF_TELEGRAF_HOST_NAME: ${LF_TELEGRAF_HOST_NAME:-host.docker.internal} + - "LF_TELEGRAF_HOST_NAME: ${LF_TELEGRAF_HOST_NAME:-host.docker.internal}" + %s """ - .formatted(getServiceName(data), getBuildContext(data), getContainerName(data)); + .formatted( + getServiceName(data), + getBuildContext(data), + getContainerName(data), + getEnvironmentFile()); } private String getEnvironmentFile() { - // FIXME: add target property env-files - var file = ".env"; - return "env-file: \"%s\"".formatted(file); + var file = context.getTargetConfig().get(DockerProperty.INSTANCE).envFile(); + if (!file.isEmpty()) { + return "env_file: \"%s\"".formatted(StringEscapeUtils.escapeXSI(file)); + } + return ""; } /** Return the name of the service represented by the given data. */ @@ -108,11 +117,23 @@ public void writeDockerComposeFile(List services) throws IOException */ public void writeDockerComposeFile(List services, String networkName) throws IOException { + var dockerComposeDir = context.getFileConfig().getSrcGenPath(); var contents = String.join( "\n", this.generateDockerServices(services), this.generateDockerNetwork(networkName)); - FileUtil.writeToFile( - contents, context.getFileConfig().getSrcGenPath().resolve("docker-compose.yml")); + FileUtil.writeToFile(contents, dockerComposeDir.resolve("docker-compose.yml")); + var envFile = context.getTargetConfig().get(DockerProperty.INSTANCE).envFile(); + if (!envFile.isEmpty()) { + var found = FileUtil.findInPackage(Path.of(envFile), context.getFileConfig()); + if (found != null) { + var destination = dockerComposeDir.resolve(found.getFileName()); + FileUtil.copyFile(found, destination); + this.context + .getErrorReporter() + .nowhere() + .info("Environment file written to " + destination); + } + } } /** diff --git a/core/src/main/java/org/lflang/target/property/DockerProperty.java b/core/src/main/java/org/lflang/target/property/DockerProperty.java index 2aa539207e..387d398aba 100644 --- a/core/src/main/java/org/lflang/target/property/DockerProperty.java +++ b/core/src/main/java/org/lflang/target/property/DockerProperty.java @@ -42,6 +42,7 @@ public DockerOptions fromAst(Element node, MessageReporter reporter) { var preBuildScript = ""; var postBuildScript = ""; var runScript = ""; + var envFile = ""; if (node.getLiteral() != null) { if (ASTUtils.toBoolean(node)) { @@ -61,6 +62,7 @@ public DockerOptions fromAst(Element node, MessageReporter reporter) { case POST_BUILD_SCRIPT -> postBuildScript = ASTUtils.elementToSingleString(entry.getValue()); case RTI_IMAGE -> rti = ASTUtils.elementToSingleString(entry.getValue()); + case ENV_FILE -> envFile = ASTUtils.elementToSingleString(entry.getValue()); } } } @@ -73,7 +75,8 @@ public DockerOptions fromAst(Element node, MessageReporter reporter) { shell, preBuildScript, postBuildScript, - runScript); + runScript, + envFile); } @Override @@ -109,6 +112,7 @@ public Element toAstElement(DockerOptions value) { case PRE_RUN_SCRIPT -> pair.setValue(ASTUtils.toElement(value.preRunScript)); case POST_BUILD_SCRIPT -> pair.setValue(ASTUtils.toElement(value.postBuildScript)); case RTI_IMAGE -> pair.setValue(ASTUtils.toElement(value.rti)); + case ENV_FILE -> pair.setValue(ASTUtils.toElement(value.envFile)); } kvp.getPairs().add(pair); } @@ -135,7 +139,8 @@ public record DockerOptions( String shell, String preBuildScript, String postBuildScript, - String preRunScript) { + String preRunScript, + String envFile) { /** Default location to pull the rti from. */ public static final String DOCKERHUB_RTI_IMAGE = "lflang/rti:rti"; @@ -146,7 +151,7 @@ public record DockerOptions( public static final String LOCAL_RTI_IMAGE = "rti:local"; public DockerOptions(boolean enabled) { - this(enabled, false, "", "", DOCKERHUB_RTI_IMAGE, DEFAULT_SHELL, "", "", ""); + this(enabled, false, "", "", DOCKERHUB_RTI_IMAGE, DEFAULT_SHELL, "", "", "", ""); } } @@ -158,6 +163,7 @@ public DockerOptions(boolean enabled) { public enum DockerOption implements DictionaryElement { NO_BUILD("no-build", PrimitiveType.BOOLEAN), BUILDER_BASE("builder-base", PrimitiveType.STRING), + ENV_FILE("env-file", PrimitiveType.STRING), RUNNER_BASE("runner-base", PrimitiveType.STRING), RTI_IMAGE("rti-image", PrimitiveType.STRING), PRE_BUILD_SCRIPT("pre-build-script", PrimitiveType.STRING), diff --git a/test/C/src/docker/federated/.env b/test/C/src/docker/federated/.env new file mode 100644 index 0000000000..e46c53f7eb --- /dev/null +++ b/test/C/src/docker/federated/.env @@ -0,0 +1,2 @@ +# define COMPOSE_DEBUG based on DEV_MODE, defaults to false +COMPOSE_DEBUG=${DEV_MODE:-false} \ No newline at end of file diff --git a/test/C/src/docker/federated/DockerOptions.lf b/test/C/src/docker/federated/DockerOptions.lf index a63608191f..bc76cc1a77 100644 --- a/test/C/src/docker/federated/DockerOptions.lf +++ b/test/C/src/docker/federated/DockerOptions.lf @@ -7,7 +7,8 @@ target C { pre-build-script: "foo.sh", pre-run-script: "bar.sh", post-build-script: "baz.sh", - no-build: false + no-build: false, + env-file: ".env" }, cmake-include: "cmake-check-environment-variable.cmake" } From 3a661ec085582399560b1030ea0cd3070d13cbe9 Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Tue, 2 Jul 2024 05:12:00 -0700 Subject: [PATCH 3/4] Update test/C/src/docker/federated/.env --- test/C/src/docker/federated/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/C/src/docker/federated/.env b/test/C/src/docker/federated/.env index e46c53f7eb..0c5d7946aa 100644 --- a/test/C/src/docker/federated/.env +++ b/test/C/src/docker/federated/.env @@ -1,2 +1,2 @@ # define COMPOSE_DEBUG based on DEV_MODE, defaults to false -COMPOSE_DEBUG=${DEV_MODE:-false} \ No newline at end of file +COMPOSE_DEBUG=${DEV_MODE:-false} From cebcbba3ca4a1440e098d9e9c926728d0eea4a42 Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Tue, 2 Jul 2024 06:14:44 -0700 Subject: [PATCH 4/4] Update core/src/main/java/org/lflang/generator/docker/DockerComposeGenerator.java Co-authored-by: Christian Menard --- .../org/lflang/generator/docker/DockerComposeGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/lflang/generator/docker/DockerComposeGenerator.java b/core/src/main/java/org/lflang/generator/docker/DockerComposeGenerator.java index 876ca7c8ce..8d65369f29 100644 --- a/core/src/main/java/org/lflang/generator/docker/DockerComposeGenerator.java +++ b/core/src/main/java/org/lflang/generator/docker/DockerComposeGenerator.java @@ -67,7 +67,7 @@ protected String getServiceDescription(DockerData data) { extra_hosts: - "host.docker.internal:host-gateway" environment: - - "LF_TELEGRAF_HOST_NAME: ${LF_TELEGRAF_HOST_NAME:-host.docker.internal}" + - "LF_TELEGRAF_HOST_NAME=${LF_TELEGRAF_HOST_NAME:-host.docker.internal}" %s """ .formatted(