我想将角度应用部署到具有不同后端网址的许多ec2实例。所以我在运行角度应用程序时切换环境。我正在使用码头工具。 docker文件的最后一行启动应用程序,如下所示
CMD ["npm", "start"]
包json start命令条目如下所示。
"start": "ng serve -H 0.0.0.0 --environment=uat1 --port=3000",
环境和端口当前在package.json中是硬编码的。我希望它对我更有活力,就像在码头运行时一样 我想通过docker run命令传递端口和环境,如下所示
docker run -p 9000:9000 -e environment=dev -e -d me/app
并将其设置在dockerfile中,如下所示
CMD ["sh", "-c", "npm start ${port} ${environment}"]
我无法让它发挥作用。有人可以帮帮我吗?
答案 0 :(得分:0)
您是否尝试覆盖命令?来自文档:
如果用户指定了docker run的参数,那么它们将覆盖CMD中指定的默认值。
应该可以{/ 1}}覆盖dockerfile中的docker run -p 9000:9000 -d me/app [MY CUSTOM COMMAND]
。
自定义命令可以是CMD
另一种方法是使用npm start --environment=uat1
。您可以在文档中查找:https://docs.docker.com/engine/reference/builder/#entrypoint
答案 1 :(得分:0)
避免在Docker中使用ng
,它只是添加了一层间接。
您可以添加一个简单的脚本作为CMD使用,以便在使用COPY app.sh /app.sh
RUN chmod 755 /app.sh
CMD [ "/app.sh" ]
替换自己之前完成Docker环境设置
Dockerfile:
#!/bin/sh
environment=${environment:-dev}
port=${port:-3000}
cd /appdir
echo "Running ${environment} on ${port}"
exec ng serve -H 0.0.0.0 --environment=${environment} --port=${port}
app.sh:
exec
ng
非常重要,因为它会将脚本替换为ng
进程,而不是将ng
作为子进程运行。
您还可以使用ENTRYPOINT设置要运行的默认二进制文件。如果您希望允许运行容器的用户直接访问ENTRYPOINT [ "ng", "serve", "-H", "0.0.0.0" ]
CMD [ "--environment=dev", "--port=3000" ]
命令行选项,则可以使用此选项。
CMD
docker run
然后成为$ docker run my/image --environment=prod --port=80
的参数将覆盖的默认选项
{{1}}