我有一个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
但是这失败了,因为看来我无法在条件语句中运行COPY
或RUN
命令。它总是失败并显示:
/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
脚本中使用。
有人可以帮我吗?任何帮助将不胜感激。
答案 0 :(得分:4)
仅使用一个'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" .