我将我的应用程序停靠,但为了查看我的更改,我必须重建我的图像,它不会给我一个我的应用程序的实时预览。
所以我创建了一个docker-compose环境,它将redis链接到我的节点容器,然后将源代码从主机安装到节点应用程序并监视它的更改。但是,由于代码不是UnionFS的一部分,因此无法进行集装箱化。
如何设置可生成dockerized图像的开发环境,但每次更改代码库时都不必重新启动?
答案 0 :(得分:3)
您使用和安装目录开发的容器映像应该与您在其他位置运行应用程序所生成的映像相同,或者至少基于生产映像(如果无法实现)。
使用简单的节点应用程序作为示例,这是基本图像:
FROM node:6
ENV NODE_ENV=production
RUN npm install forever -g
COPY docker-entrypoint.sh /entrypoint.sh
WORKDIR /app
COPY package.json /app/
RUN npm install
COPY . /app
EXPOSE 3000
ENTRYPOINT ["/entrypoint.sh"]
CMD ["node", "/app/index.js"]
生产
docker run \
--detach \
--restart always \
--publish 3000:3000 \
myapp
开发
docker run \
--publish 3000:3000 \
--volume .:/app \
--env NODE_ENV=development \
myapp \
forever -w /app/index.js
所以我修改了装载,但基本图像是相同的。已安装的文件将替换"内置的"容器中的文件。
对于node.js应用程序,还有一些额外的开发更改。环境变量和用于在更改时监视/重新启动进程的命令。当您对npm install
中的依赖项进行更改时,还需要使用docker exec $container npm install
在容器中手动执行package.json
。
如果您需要对开发环境进行一些修改,并且不想手动指定它们,则可以创建包含开发细节的开发图像FROM
。 Dockerfile.dev
:
from myapp:latest
env NODE_ENV=development
volume ["/app"]
command ["forever", "-w", "--watchDirectory", "/app" "/app/index.js"]
然后,开发细节会存储在新图像中,但仍会链接到您的真实图像。
docker build -f Dockerfile.dev -t myapp-dev .
docker run -p 3000:3000 -v .:/app myapp-dev