我正在尝试执行以下操作:
下面是我的设置:
FROM ubuntu:xenial
ARG EXECUTABLE
ENV EXECUTABLE ${EXECUTABLE}
CMD ["/opt/foo/bin/${EXECUTABLE}", "-bar"]
这是我建造集装箱的方式
docker build --build-arg EXECUTABLE=$EXECUTABLE -t test_image .
这是我运行图片的方式
docker run -d test_image
运行容器时,它崩溃并告诉我
docker: Error response from daemon: OCI runtime create failed:
container_linux.go:296: starting container process caused
"exec: \"/opt/foo/bin/${EXECUTABLE}\": stat /opt/foo/bin/${EXECUTABLE}:
no such file or directory": unknown.
答案 0 :(得分:3)
要使用环境变量,您需要使用shell。
https://docs.docker.com/engine/reference/builder/#cmd
注意:与shell窗体不同,exec窗体不会调用命令 贝壳。这意味着正常的外壳处理不会发生。对于 例如,CMD [“ echo”,“ $ HOME”]不会在 $ HOME。如果要进行外壳处理,请使用外壳形式或 直接执行外壳程序,例如:CMD [“ sh”,“-c”,“ echo $ HOME” ]。当使用exec表单并直接执行shell时,如 外壳形式的情况,就是外壳在做环境 变量扩展,而不是docker。
基于此,我认为您可以通过以下Dockerfile
正常工作。
FROM ubuntu:xenial
ARG EXECUTABLE
ENV EXECUTABLE ${EXECUTABLE}
CMD [ "sh", "-c", "/opt/foo/bin/${EXECUTABLE}", "-bar"]
答案 1 :(得分:0)
您必须写出可执行文件或填充文件,因为ARG
不支持ENV
/ CMD
替换。
ADD COPY ENV EXPOSE FROM LABEL STOPSIGNAL USER VOLUME WORKDIR
以及:
ONBUILD (when combined with one of the supported instructions above)
一种解决方法是将可执行文件写入文件并执行:
FROM ubuntu:xenial
ARG EXECUTABLE
RUN : \
&& /bin/echo -e "#!/bin/sh\nexec '/bin/$EXECUTABLE' -bar" > /exe \
&& chmod +x /exe
CMD ["/exe"]
内部版本:
docker build -t test --build-arg EXECUTABLE=echo .
运行:
$ docker run -ti test
-bar