在Dockerfile中的条件语句中运行

Bee*_*Nag 4 docker

我有一个Dockerfile目前使用以下内容的:

COPY ./compose/local/django/start.sh /start.sh
RUN sed -i 's/\r//' /start.sh
RUN chmod +x /start.sh
Run Code Online (Sandbox Code Playgroud)

如您所见,它会复制文件,然后使其可执行。现在,我需要根据构建映像时提供的参数来更改此设置。我试过使用此:

RUN if [ "$arg" = "True" ]; then \
    COPY ./compose/local/django/new.sh /new.sh \
    RUN sed -i 's/\r//' /new.sh \
    RUN chmod +x /new.sh; else \
    COPY ./compose/local/django/start.sh /start.sh \
    RUN sed -i 's/\r//' /start.sh \
    RUN chmod +x /start.sh; fi
Run Code Online (Sandbox Code Playgroud)

但这失败了,因为看来我无法在条件语句中运行COPYRUN命令。它总是失败:

/bin/sh: 1: COPY: not found
Run Code Online (Sandbox Code Playgroud)

要么

/bin/sh: 1: RUN: not found
Run Code Online (Sandbox Code Playgroud)

因此,我认为最好的做法是创建一个单独的bash文件来进行复制,例如:

#!/usr/bin/env bash

if [ "${arg}" = "True" ]; then
    echo "arg = ${arg}"
    cp ./compose/local/django/new.sh /new.sh
elif [ "${arg}" = "False" ]; then
    echo "arg = ${arg}"
    cp ./compose/local/django/start.sh /start.sh
fi
Run Code Online (Sandbox Code Playgroud)

但是我在努力使复制的bash文件可执行。我知道我可以通过chmod +x在命令行中运行来做到这一点,但是由于我不是唯一要构建此代码的人,所以我希望会有更好的解决方案,就像我以前在原始Dockerfile脚本中所做的那样。

谁能帮我这个?任何帮助将非常感激。

Ber*_*ard 10

仅使用一个“ RUN”语句。这是最佳做法,因为它会减小图像的尺寸。

这是您可以将参数传递给docker build的方式。

Dockerfile:

...
ARG NEW
COPY ./compose/local/django/new.sh /new.sh
COPY ./compose/local/django/start.sh /start.sh

RUN if [ "$NEW" = "True" ]; then \
    sed -i 's/\r//' /new.sh && \
    chmod +x /new.sh; \
  else \
    sed -i 's/\r//' /start.sh && \
    chmod +x /start.sh; \
  fi
Run Code Online (Sandbox Code Playgroud)

并像这样构建它

docker build --build-arg NEW="True" .
Run Code Online (Sandbox Code Playgroud)

  • 也许它会挽救一些生命:“[”之后和“]”之前需要空格 (22认同)
  • 另外值得注意的是,大多数 Linux docker 容器运行基本版本的 shell 而不是 bash,因此您无法替换非 shell 兼容的语法或命令。 (2认同)