在Dockerfile的CMD中使用ENV var

在Dockerfile的CMD中使用ENV var,docker,environment-variables,dockerfile,Docker,Environment Variables,Dockerfile,我正在尝试构建一个映像,我可以使用它来部署多个容器和一个角度应用程序。 其目的是让容器运行命令ng server--host${host}--port${port}--disable host check,并使用docker run或docker composes自定义环境变量,如: 默认环境变量(在Dockerfile中) docker run-d--名称栏-p 10000:4200-v/path/to/AngularApp:/www-me/ngx-admin:dev 将运行ng服务器--主机

我正在尝试构建一个映像,我可以使用它来部署多个容器和一个角度应用程序。 其目的是让容器运行命令
ng server--host${host}--port${port}--disable host check
,并使用
docker run
docker composes
自定义环境变量,如:

默认环境变量(在Dockerfile中)

docker run-d--名称栏-p 10000:4200-v/path/to/AngularApp:/www-me/ngx-admin:dev

将运行
ng服务器--主机0.0.0.0--端口4200--禁用主机检查

自定义:

docker run-d--name foo-e HOST='dev.my-domain.fr'-e PORT='4201'-p 10000:4201-v/path/to/AngularApp:/www-me/ngx-admin:dev

将运行
ng服务器--主机dev.my-domain.fr--端口4201--禁用主机检查

如果我正确理解了
ENTRYPOINT
CMD
,如果我将两者都用作“exec form”(JSON数组),
CMD
作为参数连接在
ENTRYPOINT
后面

谢谢

以下是我的Dockerfile(使用我尝试过的CMD)和我遇到的不同错误:

#基本图像
从节点:12
#安装用于量角器测试的chrome
运行wget-q-O-https://dl-ssl.google.com/linux/linux_signing_key.pub |apt密钥添加-
运行sh-c‘echo’deb[arch=amd64]http://dl.google.com/linux/chrome/deb/ 稳定的main“>>/etc/apt/sources.list.d/google.list”
运行apt-get-update&&apt-get-install-yq谷歌浏览器稳定版
#设置工作目录
WORKDIR/www
#将“/www/node\u modules/.bin”添加到$PATH
ENV PATH/www/node_modules/.bin:$PATH
#安装和缓存应用程序依赖项
复制package.json/www/package.json
运行npm安装-g@angular/cli@7.3.9
运行npm安装
#添加应用程序
抄袭/万维网
#默认环境
环境主机0.0.0.0
环境端口4200
公开${PORT}
#启动www
入口点[“ng”,“发球”]
CMD[“--host”、“0.0.0.0”、“--port”、“4200”、“--disable host check”]#有效!!
#CMD[“--host”、“${host}”、“--port”、“${port}”、“--disable host check”]35; cf.ERR 1
#CMD[“--host”、“${host}”、“--port”、${port}、“--disable host check”]35;参见错误2
#CMD[“--host”、“${host}”、“--port”、“4200”、“--disable host check”]#参见错误3
错误1 码头工人检查

“路径”:“ng”,
“Args”:[ “上菜”,
“--主机”,
“${HOST}”,
“--端口”,
“${PORT}”,
“--禁用主机检查” ],
错误2
错误:项目“/bin/sh”不支持“服务”目标。
在ServeCommand.initialize(/www/node_modules/@angular/cli/models/architect command.js:58:19)
在async ServeCommand.validateAndRun(/www/node_modules/@angular/cli/models/command.js:127:9)上
在async Object.runCommand(/www/node_modules/@angular/cli/models/command runner.js:178:24)
异步默认值为1(/www/node\u modules/@angular/cli/lib/cli/index.js:32:31)
码头工人检查

“路径”:“ng”,
“Args”:[ “上菜”,
“/bin/sh”,
“-c”,
“[\”--host\”、\“${host}\”、\“--port\”、${port}、\“--禁用主机检查\”]\t\t\35;错误2” ],
错误3
rowslist:caniuse-lite已过时。请运行下一个命令“npm update”`
getaddrinfo EAI_再次${HOST}
错误:getaddrinfo EAI_再次${HOST} 在GetAddrInfoReqWrap.onlookup[as oncomplete](dns.js:60:26)
码头工人检查

“路径”:“ng”,
“Args”:[
“上菜”,
“--主机”,
“${HOST}”,
“--端口”,
“4200”,
“--禁用主机检查” ],
当您使用执行列表时,Docker将逐字解释给定的命令(无变量扩展)

如果要展开变量,需要在
CMD
中使用shell。您可以替换
ENTRYPOINT
CMD
以仅使用此选项:

CMD ["sh", "-c", "ng serve --host ${HOST} --port ${PORT} --disable-host-check"]

进一步阅读:

这两种情况都不需要环境变量

EXPOSE 4200
CMD ["ng", "serve", "--host", "0.0.0.0", "--port", "4200", "--disable-host-check"]
对于端口号,没有什么可以阻止您运行具有相同内部端口号的多个容器。通常,您会选择一个端口号,并将其作为映像接口的一部分。您可以使用图像的端口号作为
docker run-p
选项中的第二个编号,以显示的方式从图像运行多个容器

docker run -d --name bar -p 10000:4200 me/ngx-admin:dev
docker run -d --name foo -p 10001:4200 me/ngx-admin:dev
对于
--host
选项,真正可以将其设置为的三个选项是0.0.0.0(“每个接口”)、127.0.0.1(“无法从此容器外部访问”)或容器最终拥有的IP地址。由于Docker在您组成命令行后分配IP地址,因此您无法绑定到该地址,并且您希望容器可以从外部访问,因此127.0.0.1是错误的。这使得0.0.0.0成为在那里使用的唯一合理选项


如果确实希望为此使用环境变量,请查看和的Dockerfile文档。简要回顾一下:

  • 如果同时指定这两个参数,
    CMD
    将作为命令行参数传递给
    ENTRYPOINT
  • 如果其中一个或两个都是空字符串而不是JSON数组,Docker会为您将其包装在
    sh-c'…'
    中。(同样适用于
    RUN
    )(如果
    ENTRYPOINT
    是一个空字符串,那么它基本上不会考虑
    CMD
    。)
  • 如果您使用JSON数组形式,那么传入的内容正是您键入的内容;您负责执行可能需要的任何变量扩展
最简单的方法是只使用
CMD
,而不使用JSON数组形式

CMD ng serve --host "$HOST" --port "$PORT" --disable-host-check

Docker将为您提供一个
sh-c
包装器。您不能像在问题中所显示的那样将其拆分为
ENTRYPOINT
CMD
,因为只有
CMD
部分将使用
sh-c
包装器--您将使用一个无法理解的
ng-service sh-c'--host…
命令。

这是否回答了您的问题?
EXPOSE 4200
CMD ["ng", "serve", "--host", "0.0.0.0", "--port", "4200", "--disable-host-check"]
docker run -d --name bar -p 10000:4200 me/ngx-admin:dev
docker run -d --name foo -p 10001:4200 me/ngx-admin:dev
CMD ng serve --host "$HOST" --port "$PORT" --disable-host-check