我真的很难弄清楚在构建我的对接者形象和部署到dockerhub时,我应该把我的构建步骤放在哪里。
我目前的工作流程如下:
npm install --production。然后,CircleCI将此staging image部署到dockerhub。
当合并到production image时,I会执行与上面相同的工作流,并且将创建一个。
这感觉有点奇怪,我创建了两个独立的码头形象。这是标准做法吗?
我见过很多人,包括在他们的dockerfile中的咕噜/吞咽构建步骤,但这感觉也不太好,因为所有的devDependencies,然后bower_components将与构建的代码一起出现在图像中。
运行构建步骤和构建码头映像的最佳实践是什么?让CI来做它更好,还是让dockerhub从dockerfile中这样做呢?我也在寻找最有效的方法来创建我的码头形象,用于分期和生产。
下面的是我的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:latestDockerfile:
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"]发布于 2015-10-18 14:25:12
运行构建步骤和构建码头映像的最佳实践是什么?让CI来做它更好,还是让dockerhub从dockerfile中这样做呢?
最好自己在码头外运行构建步骤。因此,相同的步骤适用于本地开发、非码头部署等。如果可能的话,请保持与对接自身的耦合。因此,使用常规的构建工具和脚本构建您的工件,只需使用ADD通过您的Dockerfile将文件构建到您的对接者映像中。
这感觉有点奇怪,我创建了两个独立的码头形象。这是标准做法吗?
我建议您使用您已经在生产舞台上构建和测试过的映像。一旦重建了图像,即使您的舞台图像工作正常,您也很容易出现差异,破坏您的生产映像。在这一点上,无论是码头或npm都不能提供严格的可复制的建设跨时间,因此,一旦它建成和测试的黄金,它是黄金,并走向生产点对点相同。
发布于 2015-10-18 14:28:45
您的循环ci应该下载所有依赖项,然后从下载的包中创建对接映像。所有测试都通过了指定的依赖项,并应被转发到生产中。一次。映像被推到带有所有依赖项的停靠中心,tumtum将同样部署到您的产品中,并且由于依赖项已经下载,创建容器需要几秒钟。
回答您关于构建相同图像的第二个查询。我建议将相同的映像部署到生产中。这将保证,在阶段的伟大工作也是同样的工作在生产。
https://stackoverflow.com/questions/33198568
复制相似问题