代码之家  ›  专栏  ›  技术社区  ›  Shalabh Negi

我们可以在DockerFile中将ARG传递给CMD吗?

  •  0
  • Shalabh Negi  · 技术社区  · 6 年前

    如何在使用docker run命令时传递ENV变量,以及您能否告诉我是否在CMD中正确传递ENV变量?

    FROM alpine
    
    LABEL MAINTAINER "CoE"
    WORKDIR /
    
    ARG proxy
    ARG username
    ARG pswd
    ENV ORG_SCRIPT
    
    RUN export http_proxy=$proxy                                                                    && \
        export https_proxy=$proxy                                                                   && \
        git clone -b master https://$username:$pswd@git.devops.company.net/dlr_ui         && \
        npm install                     
    
     EXPOSE 1401 1402 1403 1404 1405 1406 1407 1408
     WORKDIR /applications/package/ui_servers 
    CMD ["sh","./${ORG_SCRIPT}"]    // It is not getting the script name over here. Can you tell if it is correct way or not. OR i should do:
    CMD ["sh","./$ORG_SCRIPT"]
    
    I'm getting error for both. Value is not coming to that variable.
    
    Buid:
     docker build --no-cache --build-arg proxy=$http_proxy --build-arg username=dfadf--build-arg pswd=dsfadsf --build-arg -t uinodetest .
    
    
    RUN:
    docker run  -d -it -p 1401:1401 -e ORG_SCRIPT runOrg1.sh --name="Org1_UI" uinodetest
    
    OR Other method i'm using is
    
    FROM alpine
    
    LABEL MAINTAINER "CoE"
    WORKDIR /
    
    ARG proxy
    ARG username
    ARG pswd
    ENV ORG_NAME
    ENV ORG_PORT
    
    RUN export http_proxy=$proxy                                                                    && \
        export https_proxy=$proxy                                                                   && \
        git clone -b master https://$username:$pswd@git.devops.company.net/dlr_ui         && \
        npm install                     
    
     EXPOSE 1401 1402 1403 1404 1405 1406 1407 1408
     WORKDIR /applications/package/ui_servers 
    CMD ["node","Core.js","$ORG_NAME","ORG_PORT"]
    
    
    
    Buid:
     docker build --no-cache --build-arg proxy=$http_proxy --build-arg username=dfadf--build-arg pswd=dsfadsf --build-arg -t uinodetest .
    
    
    RUN:
    docker run  -d -it -p 1401:1401 -e ORG_NAME ORG1 -r ORG_PORT 1401 --name="Org1_UI" uinodetest
    

    告诉我是不是遗漏了什么或者我的语法错了。

    3 回复  |  直到 6 年前
        1
  •  2
  •   BMitch    6 年前

    Docker会将环境变量传递给容器,但您需要一个shell来解析 ${var}

    CMD ["sh","./${ORG_SCRIPT}"]
    

    我怀疑这不起作用的原因是arg传递给 sh

    CMD ["sh","-c","./${ORG_SCRIPT}"]
    

    这几乎与string/shell语法完全相同,我建议您改为:

    CMD ./${ORG_SCRIPT}
    
        2
  •  1
  •   David Maze    6 年前

    这里有几个活动部件。

    对于需要配置的东西,使用 process.env 在节点和 将它们作为命令行参数传递。在第二个示例中,请参阅 process.env.ORG_NAME ,例如。

    docker run -p 1401:3000 , docker run -p 1402:3000 等。 为运行同一映像的不同容器分配不同端口。在第一个例子中,您试图使用一个环境变量来指定整个命令;不必费心这么做,只需使用标准的Docker命令行。

    会给你一个例行的文件

    FROM node:alpine
    # Generally don't "git clone" in a Dockerfile.
    WORKDIR /dlr_ui
    COPY package.json package-lock.json ./
    RUN npm install
    COPY . ./
    EXPOSE 3000
    CMD ["node", "Core.js"]
    

    docker run -d -p 1401:3000 -e ORG_NAME=ORG1 --name="Org1_UI" uinodetest
    

    CMD、ENTRYPOINT和RUN命令有两种语法。看起来像JSON数组(但实际上不是)的表单直接运行给定的命令,而不调用任何类型的shell、解释器或变量扩展。在第二个示例中,将使用文本字符串调用脚本 $ORG_NAME ORG_PORT 作为参数。如果您只是编写类似命令的内容,而不是使用JSONish语法,那么它会自动包装为 sh -c .

    从语法上讲,我希望第一个示例可以实现您的要求(但请参见@BMitch的答案);但是直接传递命令会更简单

    docker run -d -p 1401:1401 --name="Org1_UI" uinodetest ./runOrg1.sh
    
        3
  •  0
  •   Mostafa Hussein    6 年前

    我认为更好的方法是 ENTRYPOINT CMD 执行 help

    ENTRYPOINT ["node","Core.js"]
    CMD ["--help"]
    

    然后当你启动容器时 $ORG_NAME $ORG_PORT 为了它。在这种情况下,docker将保留您的入口点并覆盖默认值 那就是 --help 在本例中,传递给其他选项,并确保将引号之间的命令视为单个命令

    因此在本例中,您将按如下方式运行容器:

    docker run -it --name my_container myimage:latest "$ORG_NAME $ORG_PORT"