Shell 将脚本作为docker构建参数传递的方法?

Shell 将脚本作为docker构建参数传递的方法?,shell,docker,Shell,Docker,我想将一个多行脚本作为参数传递给docker build命令,如下所示: docker build -t tertparam --build-arg load_cat_agent=true --build-arg deploy_cat_script=' echo "aaa"; echo "bbb" ' --no-cache . 并在构建期间执行它,我的Dockerfile如下 FROM python:3-alpine ARG load_cat_agent ARG deploy_cat_scr

我想将一个多行脚本作为参数传递给docker build命令,如下所示:

docker build -t tertparam --build-arg load_cat_agent=true --build-arg deploy_cat_script='
echo "aaa";
echo "bbb"
' --no-cache .
并在构建期间执行它,我的Dockerfile如下

FROM python:3-alpine

ARG load_cat_agent
ARG deploy_cat_script

ADD . /root/
WORKDIR /root/

RUN if [ $load_cat_agent == "true" ]; then \
         $deploy_cat_script;\
    fi
    CMD /root/start.sh && /root/wait.sh
但我发现它总是打印出来

Step 6/7 : RUN if [ $load_cat_agent == "true" ]; then    $deploy_cat_script;    fi
 ---> Running in 7868c310e8e5

"aaa" echo "bbb"

如何才能做到这一点?

一种方法是将构建参数写入shell脚本,然后运行shell脚本

FROM python:3-alpine

ARG load_cat_agent
ARG deploy_cat_script

ADD . /root/
WORKDIR /root/
RUN echo $deploy_cat_script > ./deploy_cat_script.sh
RUN chmod +x ./deploy_cat_script.sh
RUN if [ $load_cat_agent == "true" ]; then \
          ./deploy_cat_script.sh;\
    fi
CMD /root/start.sh && /root/wait.sh
输出:

Step 8/9 : RUN if [ $load_cat_agent == "true" ]; then           ./deploy_cat_script.sh;    fi
 ---> Running in 08a2f528a14d
aaa
bbb


如果您有两个非常不同的图像,以至于构建它们所需的命令不同,那么最好只使用两个单独的DockerFile。
docker build-f
命令可以指定要使用的Dockerfile,docker Compose
build:
块具有类似的
Dockerfile:
选项

#Dockerfile
来自python:3-1
WORKDIR/root/
加上/
CMD[“/root/start.sh”]
#Dockerfile.deploy
来自python:3-1
WORKDIR/root/
加上/
运行echo“aaa”\
&&回声“bbb”
CMD[“/root/start.sh”]
如果您不介意需要多次运行
docker build
,您可以从另一个映像构建
。它将继承其文件系统和元数据设置,如默认CMD

#Dockerfile.deploy,版本2
从特普兰
运行echo“aaa”\
&&回声“bbb”
docker build-t tertparam。
docker build-t tertparam deploy-f Dockerfile.deploy。

在最初的示例中,您可能可以不使用字符串,但该设置非常复杂,因此您需要编写脚本,因此,基于Dockerfile的方法可能不再困难。

部署$deploy\u cat\u脚本的问题在于shell扩展在变量扩展之前检测到命令分隔符。一种解决方案是使用
eval
。确保了解[eval命令和相关安全问题](eval命令和安全问题)

Dockerfile:

FROM python:3-alpine
ARG load_cat_agent
ARG deploy_cat_script
RUN set -x && if [ "$load_cat_agent" == "true" ]; then \
         eval "$deploy_cat_script"; \
    fi
使用更复杂的东西,例如在b c中为i部署cat脚本;是否回显$i|sed“s/^/测试:/”;“完成”
执行如下操作:

$ docker build -t tertparam --build-arg load_cat_agent=true --build-arg deploy_cat_script='for i in a b c; do echo $i | sed "s/^/test: /"; done' .
Sending build context to Docker daemon  7.168kB
Step 1/4 : FROM python:3-alpine
 ---> 59acf2b3028c
Step 2/4 : ARG load_cat_agent
 ---> Using cache
 ---> 6e383d31f589
Step 3/4 : ARG deploy_cat_script
 ---> Using cache
 ---> 04fc43723e0f
Step 4/4 : RUN set -x && if [ "$load_cat_agent" == "true" ]; then          eval "$deploy_cat_script";     fi
 ---> Running in 72e46c08072e
+ '[' true '==' true ]
+ eval 'for i in a b c; do echo $i | sed "s/^/test: /"; done'
test: a
+ echo a
+ sed 's/^/test: /'
+ sed 's/^/test: /'
+ echo b
test: b
+ sed 's/^/test: /'
+ echo c
test: c
Removing intermediate container 72e46c08072e
 ---> 765de7cf22a1
Successfully built 765de7cf22a1
Successfully tagged tertparam:latest

脚本应该在docker映像中使用Copy,然后您只需要使用load\u cat\u agent=true