【问题标题】:RUN inside a conditional statement in Dockerfile在 Dockerfile 的条件语句中运行
【发布时间】:2018-07-25 11:45:36
【问题描述】:

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

COPY ./compose/local/django/start.sh /start.sh
RUN sed -i 's/\r//' /start.sh
RUN chmod +x /start.sh

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

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

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

/bin/sh: 1: COPY: not found

/bin/sh: 1: RUN: not found

所以,我认为最好的做法是创建一个单独的 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

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

谁能帮我解决这个问题?任何帮助将不胜感激。

【问题讨论】:

标签: docker


【解决方案1】:

只使用一个“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

并像这样构建它

docker build --build-arg NEW="True" .

【讨论】:

  • 这就是我所追求的。谢谢!
  • 也许它会挽救一些生命:[ 之后和] 之前需要空间
猜你喜欢
  • 2015-07-21
  • 2014-11-12
  • 2021-02-17
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 2023-04-05
  • 2012-04-18
相关资源
最近更新 更多