AngularJS的可重用Docker镜像

我们有一个AngularJS应用程序。 我们为它写了一个dockerfile,所以它可以在每个系统上重用。 dockerfile不是最好的做法,它可能是一些奇怪的构build(构build和托pipe在同一个文件中),但它只是创build在每个开发人员的每台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 .构build我们的镜像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,重build图像并启动它。 我们也不想声明一些可以在那里使用的URL(dev,uat,prod,..)。 我们想用环境variables而不是硬编码的URL来执行我们的gulp build过程。

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

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

有没有经验这类问题的人? 所以我们需要在我们的json中创build一个envvariables,并在稍后添加URL。

编辑:更好的select是使用构build参数

在docker run命令中不要传递URL,你可以使用docker build args。 在Docker构build期间执行构build相关命令比docker运行更好。

在你的Dockerfile中,

 ARG URL 

然后运行

 docker build --build-arg URL=<my-url> . 

有关详细信息,请参阅此计算器问题

这是我的“解决scheme”。 我知道这不是最好的docker工具,但对我们的开发者来说,这是一个很大的帮助。

我的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;" 

所以当我的容器启动时会发生构build。 当然不是最好的方式,但这一切都是为了开发者的需要。 有一个简单的本地前端。

sed命令将在configuration文件中执行replace,其中包含如下所示的内容:

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

所以我的url将被replace为我的环境variables的内容,我将在我的docker run命令中定义。

比我能够执行。

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

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