AngularJS

时间:2016-07-18 11:57:41

标签: angularjs json docker environment-variables dockerfile

我们有一个AngularJS应用程序。我们为它编写了一个dockerfile,以便它可以在每个系统上重用。 dockerfile不是最佳实践,它可能是一些奇怪的构建(在同一个文件中构建和托管),但它只是为了在每个开发人员的每台PC上本地运行我们的angularjs应用程序而创建的

Dockerfile:
FROM nginx:1.10

... Steps to install nodejs-legacy + npm

RUN npm install -g gulp
RUN npm install
RUN gulp build  

.. steps to move dist folder

我们使用docker build -t myapp:latest .构建图片 每个开发人员都可以使用docker run -d -p 80:80 myapp:latest

运行我们的应用

但现在我们正在开发其他后端。所以我们在DEV中有一个后端,UAT中的后端,...... 因此,我们需要在/config/xx.json

中使用不同的URL
{
  ...
  "service_base": "https://backend.test.xxx/",
  ...
}

我们不想每次都更改该网址,重建图片并启动它。我们也不想声明可以在那里使用的一些URL(dev,uat,prod,..)。我们希望使用环境变量而不是硬编码的URL执行gulp build进程。

所以我们可以像这样开始我们的容器:

docker run -d -p 80:80 --env URL=https://mybackendurl.com app:latest

是否有人有过这类问题的经验?所以我们在json中需要一个env变量并构建它,如果可能的话,稍后再添加URL。

2 个答案:

答案 0 :(得分:1)

编辑:更好的选择是使用build args

您可以使用docker build args,而不是在docker run命令中传递URL。最好在docker build期间执行构建相关命令而不是docker run。

在Dockerfile中,

projectA

然后运行

ChildstreamA_streamA

有关详细信息,请参阅此stackoverflow question

答案 1 :(得分:0)

这是我的“解决方案”。我知道这不是最好的码头工作方法,但对我们的开发人员来说这是一个很大的帮助。

我的dockerfile如下所示:

FROM nginx:1.10

RUN apt-get update && \
 apt-get install -y curl

RUN sed -i "s/httpredir.debian.org/`curl -s -D - http://httpredir.debian.org/demo/debian/ | awk '/^Link:/ { print $2 }' | sed -e 's@<http://\(.*\)/debian/>;@\1@g'`/" /etc/apt/sources.list

RUN \
  apt-get clean && \
  apt-get update && \
  apt-get install -y nodejs-legacy && \
  apt-get install -y npm

WORKDIR /home/app
COPY . /home/app

RUN npm install -g gulp
RUN npm install

COPY start.sh /
CMD ["./start.sh"]

所以在我的nginx中安装了app + npm之后,我用start.sh脚本启动了我的容器。

start.sh的内容:

#!/bin/bash
sed -i 's@my-url@'"$DATA_ACCESS_URL"'@' configs/config.json
gulp build
rm -r /usr/share/nginx/html/
//cp right folders which are created by gulp build to /usr/share/nginx/html
...
//start nginx container
/usr/sbin/nginx -g "daemon off;"

因此,当我的容器启动时,将进行构建。当然不是最好的方式,但这完全取决于开发人员的需求。有一个简单的当地前端。

sed命令将对配置文件执行替换,其中包含以下内容:

{
  "service_base": "my-url",
}

所以my-url将被我的环境变量的内容所取代,我将在docker run命令中定义。

比我能够表演。

docker run -d -p 80:80 -e DATA_ACCESS_URL=https://mybackendurl.com app:latest

每个开发人员都可以在本地使用前端并连接他们自己的后端URL。