我们有一个前端应用程序。
它是用Angular(html + css + javascript)编写的,需要由网络服务器(nginx)托管。
Angular正在与将与后端进行通信的NodeJs服务器进行通信。
现在我们必须在Docker中运行它。
那么是否可以在一个存储库中写入2个dockerfile?
主要思想是为nodejs创建1个dockerfile,该文件也正在运行bower安装,npm安装,...
看起来像这样:
# Create app directory
RUN mkdir -p /usr/src/www
WORKDIR /usr/src/www
RUN npm install -g bower
RUN npm install -g gulp
# Install app dependencies
COPY . /usr/src/www/
RUN bower install
RUN npm install
RUN gulp build
EXPOSE port
CMD [ "node", "server.js" ]
还有一个dockerfile,我们在其中运行nginx-webserver,但还将包含nginx.conf,因此它可以指向node.js-container中正确的/ dist文件夹
Nginx的dockerfile如下所示:
# Set nginx base image
FROM nginx
# Copy custom configuration file from the current directory
COPY nginx.conf /etc/nginx/nginx.conf
nginx.conf的示例
location ~* /dist {
proxy_pass http://nodejs:port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
最佳答案
我认为最好使用2个docker容器,每个容器设计的单一责任值得遵循。
每个项目必须创建多个容器是很常见的:
一种方法是为docker定义创建文件夹,并为每个docker上下文创建一个脚本
docker_build.sh
,以准备docker上下文(复制所需的所有 Artifact :lib,源代码等),最后进行docker构建。project_root/
|----src/
|----docker/
|----|----angular/
|----|----|-----Dockerfile
|----|----|-----docker_build.sh
|----|----nodejs/
|----|----|-----Dockerfile
|----|----|-----docker_build.sh
docker_build.sh的示例
#!/bin/bash
# create temp directory for building
mkdir DockerBuildTempPath/
# copy files to temp directory
cp -arv Dockerfile DockerBuildTempPath/
cp -arv ../../src/ DockerBuildTempPath/
# ... etc
cd DockerBuildTempPath
#build image
docker build -t myapp .
# remove temp directory
cd ..
rm -r ./DockerBuildTempPath/