CMD中的Docker ENV

Log*_*son 3 docker dockerfile

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

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

以下是我的设置:

FROM ubuntu:xenial

ARG EXECUTABLE

ENV EXECUTABLE ${EXECUTABLE}


CMD ["/opt/foo/bin/${EXECUTABLE}", "-bar"]
Run Code Online (Sandbox Code Playgroud)

这是我建造集装箱的方式

    docker build --build-arg EXECUTABLE=$EXECUTABLE  -t test_image .
Run Code Online (Sandbox Code Playgroud)

这是我运行图像的方式

    docker run -d test_image
Run Code Online (Sandbox Code Playgroud)

当我运行容器时,它崩溃并告诉我

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.
Run Code Online (Sandbox Code Playgroud)

kur*_*oka 6

要使用环境变量,您需要使用shell。
https://docs.docker.com/engine/reference/builder/#cmd

注意:与shell窗体不同,exec窗体不会调用命令shell。这意味着正常的外壳处理不会发生。例如,CMD [“ echo”,“ $ HOME”]不会在$ HOME上进行变量替换。如果要进行外壳处理,则可以使用外壳形式或直接执行外壳,例如:CMD [“ sh”,“-c”,“ echo $ HOME”]。当使用exec表单并直接执行shell时(例如在shell表单中),是由shell进行环境变量扩展,而不是docker。

基于此,我认为您可以通过以下方法很好地工作Dockerfile

FROM ubuntu:xenial

ARG EXECUTABLE

ENV EXECUTABLE ${EXECUTABLE}

CMD [ "sh", "-c", "/opt/foo/bin/${EXECUTABLE}", "-bar"]
Run Code Online (Sandbox Code Playgroud)