Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ RUN groupadd -g $BENTO_USER_GID -o $BENTO_USER && useradd -m -u $BENTO_USER_UID
{% block SETUP_BENTO_ENVARS %}
{% if __options__env is not none %}
{% for key, value in __options__env.items() -%}
ARG {{ key }}={{ value }}
ENV {{ key }}=${{ key }}
ARG {{ key|normalize_line }}={{ value|normalize_line|bash_quote }}
ENV {{ key|normalize_line }}=${{ key|normalize_line }}
{% endfor -%}
{% endif -%}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ ENV BENTOML_CONTAINERIZED=true
{% for env in __bento_envs__ %}
{% set stage = env.stage | default("all") -%}
{% if stage != "runtime" -%}
ARG {{ env.name|normalize_line }}{% if env.value %}={{ env.value | bash_quote }}{% endif %}
ARG {{ env.name|normalize_line }}{% if env.value %}={{ env.value | normalize_line | bash_quote }}{% endif %}

ENV {{ env.name|normalize_line }}=${{ env.name|normalize_line }}
{% endif -%}
Expand Down
48 changes: 48 additions & 0 deletions tests/unit/_internal/container/test_generate.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
from __future__ import annotations

from _bentoml_impl.docker import generate_dockerfile as generate_v2_dockerfile
from bentoml._internal.bento.bento import ImageInfo
from bentoml._internal.bento.build_config import BentoEnvSchema
from bentoml._internal.bento.build_config import CondaOptions
from bentoml._internal.bento.build_config import DockerOptions
from bentoml._internal.container.generate import build_environment
Expand All @@ -21,6 +24,51 @@ def test_build_environment_registers_normalize_line_filter() -> None:
)


def test_generate_containerfile_env_dict_collapses_newlines(tmp_path) -> None:
dockerfile = generate_containerfile(
DockerOptions(
distro="debian",
python_version="3.11",
env={"X": "a\nRUN echo PWNED\n"},
),
str(tmp_path),
conda=CondaOptions(),
bento_fs=tmp_path,
)

# the value stays on the quoted ARG line instead of injecting an instruction
assert "ARG X='a RUN echo PWNED'" in dockerfile
assert "\nRUN echo PWNED" not in dockerfile


def test_generate_v2_containerfile_env_collapses_newlines(tmp_path) -> None:
dockerfile = generate_v2_dockerfile(
ImageInfo(base_image="python:3.11-slim", python_version="3.11"),
tmp_path,
envs=[BentoEnvSchema(name="X", value="a\nRUN echo PWNED\n")],
command="true",
)

assert "ARG X='a RUN echo PWNED'" in dockerfile
assert "\nRUN echo PWNED" not in dockerfile


def test_docker_options_env_preserves_value_whitespace() -> None:
options = DockerOptions(
env={
"JAVA_OPTS": "-Xmx1g -Xms512m",
"PEM": " indented value ",
"TABBED": "a\tb",
},
)

assert options.env == {
"JAVA_OPTS": "-Xmx1g -Xms512m",
"PEM": " indented value ",
"TABBED": "a\tb",
}


def test_generate_containerfile_quotes_system_packages(tmp_path) -> None:
dockerfile = generate_containerfile(
DockerOptions(
Expand Down