Shell 将脚本作为docker构建参数传递的方法?
我想将一个多行脚本作为参数传递给docker build命令,如下所示: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 -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 Composebuild:
块具有类似的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