Docker 或其任何插件是否支持可以有选择地执行某些 运行 命令块的条件语法?
Does Docker or any of its plugins support conditional syntax where certain blocks of RUN commands can be selectively executed?
我正在尝试为我的开发环境创建一个 Dockerfile,我可以使用它来通过设置各种标志来自定义图像。
以下示例说明了这一点,我目前正在使用 ARG 和 bash if/then 来完成此操作。但是,它很快就会变得非常麻烦。这个微不足道的案例说明,有时我想单独使用 Python,有时,Python 和 R,有时单独使用 R,然后有时将这些与 vi 混合使用。这是一个微不足道的案例,我的实际用例只是更多这样的选项(R、Python、C++、vi、EMACS 等等。)
FROM debian
ARG R
ARG PY
ARG VI
RUN apt-get update
RUN if [ $VI = 1 ]; then apt-get install vim -y; fi
RUN if [ $PY = 1 ]; then apt-get install python3 -y; fi
RUN if [ $R = 1 ]; then apt-get install r-base r-base-dev -y; fi
也就是说,如果我想构建一个安装了 R 和 vi 的开发映像,我可以发出以下命令:
docker build -t foo --build-arg VI=1 --build-arg R=1 .
我可以采用的另一种方法似乎是多阶段构建,但它似乎无法让我灵活地选择我想要的组件。
根据我的研究,buildx 似乎是此应用程序的正确工具。
如果 buildx 是解决此问题的正确方法之一,如果人们可以插话,我将不胜感激
您显示的是 Docker 任何版本都支持的唯一条件语法。见标准Dockerfile reference, the BuildKit Dockerfile extensions, and Build images with BuildKit; none 除了在 RUN
命令中嵌入 shell if ... fi
条件语句外,还支持任何条件语法。
在实践中,您并不真正需要您显示的条件级别。 Docker 图像通常会打包单个应用程序及其依赖项,并且您知道这些依赖项是什么。所以如果你的应用在Python,你需要安装Python;如果它调用 subprocess.call(["vim", ...])
那么你需要那个外部依赖;等等。通常,使用一个固定的 Docker 文件将您需要的东西安装在您需要的地方比无限地自定义它要简单得多。
我正在尝试为我的开发环境创建一个 Dockerfile,我可以使用它来通过设置各种标志来自定义图像。
以下示例说明了这一点,我目前正在使用 ARG 和 bash if/then 来完成此操作。但是,它很快就会变得非常麻烦。这个微不足道的案例说明,有时我想单独使用 Python,有时,Python 和 R,有时单独使用 R,然后有时将这些与 vi 混合使用。这是一个微不足道的案例,我的实际用例只是更多这样的选项(R、Python、C++、vi、EMACS 等等。)
FROM debian
ARG R
ARG PY
ARG VI
RUN apt-get update
RUN if [ $VI = 1 ]; then apt-get install vim -y; fi
RUN if [ $PY = 1 ]; then apt-get install python3 -y; fi
RUN if [ $R = 1 ]; then apt-get install r-base r-base-dev -y; fi
也就是说,如果我想构建一个安装了 R 和 vi 的开发映像,我可以发出以下命令:
docker build -t foo --build-arg VI=1 --build-arg R=1 .
我可以采用的另一种方法似乎是多阶段构建,但它似乎无法让我灵活地选择我想要的组件。
根据我的研究,buildx 似乎是此应用程序的正确工具。 如果 buildx 是解决此问题的正确方法之一,如果人们可以插话,我将不胜感激
您显示的是 Docker 任何版本都支持的唯一条件语法。见标准Dockerfile reference, the BuildKit Dockerfile extensions, and Build images with BuildKit; none 除了在 RUN
命令中嵌入 shell if ... fi
条件语句外,还支持任何条件语法。
在实践中,您并不真正需要您显示的条件级别。 Docker 图像通常会打包单个应用程序及其依赖项,并且您知道这些依赖项是什么。所以如果你的应用在Python,你需要安装Python;如果它调用 subprocess.call(["vim", ...])
那么你需要那个外部依赖;等等。通常,使用一个固定的 Docker 文件将您需要的东西安装在您需要的地方比无限地自定义它要简单得多。