在构建我的docker镜像并部署到dockerhub时,我真的很难弄明白我应该把我的grunt构建步骤放在哪里。
我目前的工作流程如下:
npm install --production
。然后,CircleCI将此staging image
部署到dockerhub 我执行与上面相同的工作流程,合并为母版时,而是创建了production image
。
我创建了2个独立的泊坞窗图像,感觉有点奇怪。这是标准做法吗?
我见过很多人,包括他们的dockerfiles中的grunt / gulp构建步骤,但是感觉不对,因为所有devDependencies
和bower_components
都会在图像和内置代码。
运行构建步骤和构建docker镜像的最佳做法是什么?让CI做到这一点更好,还是dockerhub从dockerfile做到这一点?我也是最有效的方法来创建用于登台和制作的docker镜像。
下面是我的circleCI.yml文件,后面是我的Dockerfile。
circle.yml:
machine:
node:
version: 4.2.1
# Set the timezeone - any value from /usr/share/zoneinfo/ is valid here
timezone:
Europe/London
services:
- docker
pre:
- sudo curl -L -o /usr/bin/docker 'http://s3-external-1.amazonaws.com/circle-downloads/docker-1.8.2-circleci'; sudo chmod 0755 /usr/bin/docker; true
dependencies:
pre:
- docker --version
- sudo pip install -U docker-compose==1.4.2
- sudo pip install tutum
override:
- npm install:
pwd: node
post:
- npm run bower_install:
pwd: node
- npm run grunt_build:
pwd: node
test:
override:
- cd node && npm run test
deployment:
staging:
branch: staging
commands:
- docker-compose -f docker-compose.production.yml build node
# - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
- tutum login -u $DOCKER_USER -p $DOCKER_PASS -e $DOCKER_EMAIL
- docker tag dh_node:latest tutum.co/${DOCKER_USER}/dh_stage:latest
- docker push tutum.co/${DOCKER_USER}/dh_stage:latest
master:
branch: master
commands:
- docker-compose -f docker-compose.production.yml build node
# - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
- tutum login -u $DOCKER_USER -p $DOCKER_PASS -e $DOCKER_EMAIL
- docker tag dh_node:latest tutum.co/${DOCKER_USER}/dh_prod:latest
- docker push tutum.co/${DOCKER_USER}/dh_prod:latest
Dockerfile:
FROM node:4.2
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install --production
COPY . /usr/src/app
#
#
# Commented the following steps out, as these
# now run on CircleCI before the image is built.
# (Whether that's right, or not, i'm not sure.)
#
# Install bower
# RUN npm install -g bower # grunt-cli
#
# WORKDIR src/app
# RUN bower install --allow-root
#
# Expose port
EXPOSE 3000
# Run app using nodemon
CMD ["npm", "start"]
答案 0 :(得分:1)
运行构建步骤和构建docker镜像的最佳做法是什么?让CI做到这一点更好,或者dockerhub是否可以从dockerfile中做到这一点?
最好在docker之外运行构建步骤。因此,相同的步骤适用于本地开发,非停靠器部署等。尽可能保持耦合器与docker本身松散。因此,使用常规构建工具和脚本构建工件,并通过ADD
将Dockerfile
构建的文件构建到docker镜像。
我创建了2个独立的泊坞窗图像,感觉有点奇怪。这是标准做法吗?
我建议改为使用您已在生产舞台上构建和测试的图像。重建图像后,即使您的舞台图像工作正常,也很容易出现打破生产图像的差异。在这一点上,docker和npm都不能提供跨时间严格可重复的构建,因此一旦它构建并测试了黄金,它就是黄金,并且逐点地生产。
答案 1 :(得分:0)
您的圈子ci应该下载所有依赖项,然后从下载的包中创建docker镜像。所有测试都以指定的依赖关系传递,并应转发到生产环境。一旦。图像被推送到具有所有依赖关系的docker hub,而tumtum将将其部署到您的生产中,并且由于已经下载了依赖项,因此创建容器需要几秒钟。
回答第二次构建相同图片的问题。我建议将相同的图像部署到生产中。这将保证您在升级时工作得很好,在生产中也是如此。