我们有一个前端应用程序。 它是用Angular(html + css + javascript)编写的,需要由webserver(nginx)托管。 Angular正在与将与后端通信的NodeJs服务器进行通信。
现在我们必须在Docker中运行它。
那么可以在一个存储库中编写2个dockerfiles吗? 主要的想法是为nodejs提供1个dockerfile,它还运行bower install,npm install,... 这将是这样的:
# 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中的right / 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;
答案 0 :(得分:5)
在我看来,使用2个泊坞容器是最佳选择,每个容器设计的单一责任值得遵循。
每个项目必须创建多个容器非常常见:
一种方法是为docker定义和每个docker上下文创建一个文件夹,创建一个脚本docker_build.sh
,用于准备docker上下文(复制所需的所有工件:libs,源代码等),最后创建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/
答案 1 :(得分:0)
尝试使用jwilder / nginx-proxy(https://github.com/jwilder/nginx-proxy)。我目前正在使用它来托管一个主Docker Nginx,代理我所有其他的docker服务。