docker - 在 Dockerfile 的 CMD 中使用 ENV var
问题描述
我正在尝试构建一个图像,我可以使用它来部署具有角度应用程序的多个容器。目的是让容器运行命令并使用以下命令自ng server --host ${HOST} --port ${PORT} --disable-host-check
定义 ENV var :docker run
docker-composes
默认环境变量(在 Dockerfile 中)
docker run -d --name bar -p 10000:4200 -v /path/to/AngularApp:/www me/ngx-admin:dev
会跑ng server --host 0.0.0.0 --port 4200 --disable-host-check
风俗 :
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 server --host dev.my-domain.fr --port 4201 --disable-host-check
如果我理解正确ENTRYPOINT
,CMD
如果我将两者都用作“执行表单”(JSON 数组),CMD
则后面会连接ENTRYPOINT
为参数。
谢谢!
这是我的 Dockerfile(使用我尝试过的 CMD)和我遇到的不同错误:
# base image
FROM node:12
# install chrome for protractor tests
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
RUN apt-get update && apt-get install -yq google-chrome-stable
# set working directory
WORKDIR /www
# add `/www/node_modules/.bin` to $PATH
ENV PATH /www/node_modules/.bin:$PATH
# install and cache app dependencies
COPY package.json /www/package.json
RUN npm install -g @angular/cli@7.3.9
RUN npm install
# add app
COPY . /www
# default env
ENV HOST 0.0.0.0
ENV PORT 4200
EXPOSE ${PORT}
# start www
ENTRYPOINT ["ng", "serve"]
CMD ["--host", "0.0.0.0", "--port", "4200", "--disable-host-check"] # WORKS!!
#CMD ["--host", "${HOST}", "--port", "${PORT}", "--disable-host-check"] # cf. ERR 1
#CMD ["--host", "${HOST}", "--port", ${PORT}, "--disable-host-check"] # cf. ERR 2
#CMD ["--host", "${HOST}", "--port", "4200", "--disable-host-check"] # cf. ERR 3
错误 1
Cannot parse arguments. See below for the reasons.
Argument port could not be parsed using value "".Valid type(s) is: number
码头工人检查
"Path": "ng",<br>
"Args": [
"serve",<br>
"--host",<br>
"${HOST}",<br>
"--port",<br>
"${PORT}",<br>
"--disable-host-check"
],
错误 2
Error: Project '/bin/sh' does not support the 'serve' target.
at ServeCommand.initialize (/www/node_modules/@angular/cli/models/architect-command.js:58:19)<br>
at async ServeCommand.validateAndRun (/www/node_modules/@angular/cli/models/command.js:127:9)<br>
at async Object.runCommand (/www/node_modules/@angular/cli/models/command-runner.js:178:24)<br>
at async default_1 (/www/node_modules/@angular/cli/lib/cli/index.js:32:31)
码头工人检查
"Path": "ng",<br>
"Args": [
"serve",<br>
"/bin/sh",<br>
"-c",<br>
"[\"--host\", \"${HOST}\", \"--port\", ${PORT}, \"--disable-host-check\"]\t\t# ERR 2"
],
错误 3
rowserslist: caniuse-lite is outdated. Please run next command `npm update`
getaddrinfo EAI_AGAIN ${HOST}<br>
Error: getaddrinfo EAI_AGAIN ${HOST}
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:60:26)
码头工人检查
"Path": "ng",<br>
"Args": [<br>
"serve",<br>
"--host",<br>
"${HOST}",<br>
"--port",<br>
"4200",<br>
"--disable-host-check"
],
解决方案
当你使用执行列表时,Docker 会按字面意思解释给定的命令(没有变量扩展)。
如果你想扩展变量,你需要在你的CMD
. 您可以替换您的ENTRYPOINT
andCMD
以仅使用它:
CMD ["sh", "-c", "ng serve --host ${HOST} --port ${PORT} --disable-host-check"]
推荐阅读
- php - file_get_contents 无法打开流:连接超时
- javascript - 从头开始卸载 React 应用程序(Linux)
- python-3.x - Docker、Python 和“导入日志”
- php - WooCommerce 产品级别的简单票务系统
- python - Flask-login 无法设置会话 cookie
- ios - krpano 虚拟之旅从 iOS 向 Linux Apache 中每个变化的场景询问凭据
- ruby-on-rails - 如何从即将到来的发票条带 API 调用中接收即将到来的发票 pdf?
- python - Gmail API 插入带附件的电子邮件不显示附件出现在邮件列表显示中
- java - FeignClient 使用 application/x-www-form-urlencoded 正文创建 POST
- terraform - 如何将 Terraform 降级到以前的版本?