Skip to content

Commit

Permalink
Support additional_contexts
Browse files Browse the repository at this point in the history
Signed-off-by: Otto Liljalaakso <[email protected]>
  • Loading branch information
otto-liljalaakso-nt authored and p12tic committed May 21, 2024
1 parent 3bb305c commit 11ac786
Show file tree
Hide file tree
Showing 8 changed files with 91 additions and 0 deletions.
8 changes: 8 additions & 0 deletions podman_compose.py
Original file line number Diff line number Diff line change
Expand Up @@ -1464,6 +1464,12 @@ def normalize_service(service, sub_dir=""):
if not context:
context = "."
service["build"]["context"] = context
if "build" in service and "additional_contexts" in service["build"]:
if is_dict(build["additional_contexts"]):
new_additional_contexts = []
for k, v in build["additional_contexts"].items():
new_additional_contexts.append(f"{k}={v}")
build["additional_contexts"] = new_additional_contexts
for key in ("command", "entrypoint"):
if key in service:
if is_str(service[key]):
Expand Down Expand Up @@ -2330,6 +2336,8 @@ async def build_one(compose, args, cnt):
build_args.extend(get_secret_args(compose, cnt, secret, podman_is_building=True))
for tag in build_desc.get("tags", []):
build_args.extend(["-t", tag])
for additional_ctx in build_desc.get("additional_contexts", {}):
build_args.extend([f"--build-context={additional_ctx}"])
if "target" in build_desc:
build_args.extend(["--target", build_desc["target"]])
container_to_ulimit_build_args(cnt, build_args)
Expand Down
8 changes: 8 additions & 0 deletions pytests/test_normalize_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,14 @@ class TestNormalizeService(unittest.TestCase):
{"build": {"context": "./dir-1", "dockerfile": "dockerfile-1"}},
{"build": {"context": "./dir-1", "dockerfile": "dockerfile-1"}},
),
(
{"build": {"additional_contexts": ["ctx=../ctx", "ctx2=../ctx2"]}},
{"build": {"additional_contexts": ["ctx=../ctx", "ctx2=../ctx2"]}}
),
(
{"build": {"additional_contexts": {"ctx": "../ctx", "ctx2": "../ctx2"}}},
{"build": {"additional_contexts": ["ctx=../ctx", "ctx2=../ctx2"]}}
),
])
def test_simple(self, input, expected):
self.assertEqual(normalize_service(input), expected)
Expand Down
14 changes: 14 additions & 0 deletions tests/additional_contexts/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Test podman-compose with build.additional_contexts

```
podman-compose build
podman-compose up
podman-compose down
```

expected output would be

```
[dict] | Data for dict
[list] | Data for list
```
1 change: 1 addition & 0 deletions tests/additional_contexts/data_for_dict/data.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Data for dict
1 change: 1 addition & 0 deletions tests/additional_contexts/data_for_list/data.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Data for list
3 changes: 3 additions & 0 deletions tests/additional_contexts/project/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
FROM busybox
COPY --from=data data.txt /data/data.txt
CMD ["busybox", "cat", "/data/data.txt"]
12 changes: 12 additions & 0 deletions tests/additional_contexts/project/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
version: "3.7"
services:
dict:
build:
context: .
additional_contexts:
data: ../data_for_dict
list:
build:
context: .
additional_contexts:
- data=../data_for_list
44 changes: 44 additions & 0 deletions tests/test_podman_compose_additional_contexts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# SPDX-License-Identifier: GPL-2.0


"""Test how additional contexts are passed to podman."""

import os
import subprocess
import unittest

from .test_podman_compose import podman_compose_path
from .test_podman_compose import test_path


def compose_yaml_path():
""" "Returns the path to the compose file used for this test module"""
return os.path.join(test_path(), "additional_contexts", "project")


class TestComposeBuildAdditionalContexts(unittest.TestCase):
def test_build_additional_context(self):
"""podman build should receive additional contexts as --build-context
See additional_context/project/docker-compose.yaml for context paths
"""
cmd = (
"coverage",
"run",
podman_compose_path(),
"--dry-run",
"--verbose",
"-f",
os.path.join(compose_yaml_path(), "docker-compose.yml"),
"build",
)
p = subprocess.run(
cmd,
stdout=subprocess.PIPE,
check=False,
stderr=subprocess.STDOUT,
text=True,
)
self.assertEqual(p.returncode, 0)
self.assertIn("--build-context=data=../data_for_dict", p.stdout)
self.assertIn("--build-context=data=../data_for_list", p.stdout)

0 comments on commit 11ac786

Please sign in to comment.