CMD中的Docker ENV

时间:2018-10-13 03:11:47

标签: docker dockerfile

我正在尝试执行以下操作:

  1. 将构建参数传递给我的docker build命令
  2. 将其作为环境变量存储在我的容器中
  3. 在我的CMD中使用它以在容器启动时启动。

下面是我的设置:

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.

2 个答案:

答案 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替换。

supported substitutions的列表:

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