我们有一个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
{
...
"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。
答案 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。