CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛

编写,撰写(这都可以?)编写怎么说,如何编写最佳的 Dockerfile,

1.撰写和编写怎么用

译者: Fundebug原文:https://rock-it.pl/how-to-write-excellent-dockerfiles/本文地址:https://blog.fundebug.com/2017/05/15/write-excellent-dockerfile/

2.如何编写百度百科

译者按:Dockerfile 的语法非常简单,然而如何加快镜像构建速度,如何减少 Docker 镜像的大小却不是那么直观,需要积累实践经验这篇博客可以帮助你快速掌握编写 Dockerfile 的技巧原文: How to write excellent Dockerfiles

3.怎么样编写

译者: Fundebug本文采用意译,版权归原作者所有我已经使用 Docker 有一段时间了,其中编写 Dockerfile 是非常重要的一部分工作在这篇博客中,我打算分享一些建议,帮助大家编写更好的 Dockerfile。

4.什么叫编写

目标:更快的构建速度更小的 Docker 镜像大小更少的 Docker 镜像层充分利用镜像缓存增加 Dockerfile 可读性让 Docker 容器使用起来更简单总结编写. dockerignore 文件

5.撰写 编写 区别

容器只运行单个应用将多个 RUN 指令合并为一个基础镜像的标签不要用 latest每个 RUN 指令后删除多余文件选择合适的基础镜像 (alpine 版本最好)设置 WORKDIR 和 CMD使用 ENTRYPOINT (可选)

6.撰写和编写是什么意思

在 entrypoint 脚本中使用 execCOPY 与 ADD 优先使用前者合理调整 COPY 与 RUN 的顺序设置默认的环境变量,映射端口和数据卷使用 LABEL 设置镜像元数据添加 HEALTHCHECK

7.编撰的撰怎么写

示例示例 Dockerfile 犯了几乎所有的错 (当然我是故意的)接下来,我会一步步优化它假设我们需要使用 Docker 运行一个 Node.js 应用,下面就是它的 Dockerfile(CMD 指令太复杂了,所以我简化了,它是错误的,仅供参考)。

8.编写总结也可以说是

FROM ubuntuADD . /appRUN apt-get updateRUN apt-get upgrade -yRUN apt-get install -y nodejs ssh mysqlRUN cd /app && npm install

9.撰写与编写

# this should start three processes, mysql and ssh# in the background and node app in foreground# isnt it beautifully terrible? <3

10.撰写还是编写

CMD mysql & sshd & npm start构建镜像:docker build -t wtf .1. 编写. dockerignore 文件构建镜像时,Docker 需要先准备context

,将所有需要的文件收集到进程中默认的context包含 Dockerfile 目录中的所有文件,但是实际上,我们并不需要. git 目录,node_modules 目录等内容.dockerignore的作用和语法类似于

.gitignore,可以忽略一些不需要的文件,这样可以有效加快镜像构建时间,同时减少 Docker 镜像的大小示例如下:.git/node_modules/2. 容器只运行单个应用从技术角度讲,你可以在 Docker 容器中运行多个进程。

你可以将数据库,前端,后端,ssh,supervisor 都运行在同一个 Docker 容器中但是,这会让你非常痛苦:非常长的构建时间 (修改前端之后,整个后端也需要重新构建)非常大的镜像大小多个应用的日志难以处理 (不能直接使用 stdout,否则多个应用的日志会混合到一起)

横向扩展时非常浪费资源 (不同的应用需要运行的容器数并不相同)僵尸进程问题 – 你需要选择合适的 init 进程因此,我建议大家为每个应用构建单独的 Docker 镜像,然后使用 Docker Compose 运行多个 Docker 容器。

现在,我从 Dockerfile 中删除一些不需要的安装包,另外,SSH 可以用 docker exec 替代示例如下:FROM ubuntuADD . /appRUN apt-get updateRUN apt-get upgrade -y

# we should remove ssh and mysql, and use# separate container for databaseRUN apt-get install -y nodejs # ssh mysql

RUN cd /app && npm installCMD npm start3. 将多个 RUN 指令合并为一个Docker 镜像是分层的,下面这些知识点非常重要:Dockerfile 中的每个指令都会创建一个新的镜像层。

镜像层将被缓存和复用当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效镜像层是不可变的,如果我们再某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件 (只是这个文件在 Docker 容器中不可见了)。

Docker 镜像类似于洋葱它们都有很多层为了修改内层,则需要将外面的层都删掉记住这一点的话,其他内容就很好理解了现在,我们将所有的 RUN 指令合并为一个同时把apt-get upgrade删除,因为它会使得镜像构建非常不确定 (我们只需要依赖基础镜像的更新就好了)

FROM ubuntuADD . /appRUN apt-get update \&& apt-get install -y nodejs \&& cd /app \&& npm installCMD npm start

记住一点,我们只能将变化频率一样的指令合并在一起将 node.js 安装与 npm 模块安装放在一起的话,则每次修改源代码,都需要重新安装 node.js,这显然不合适因此,正确的写法是这样的:FROM ubuntu。

RUN apt-get update && apt-get install -y nodejsADD . /appRUN cd /app && npm installCMD npm start4. 基础镜像的标签不要用 latest

当镜像没有指定标签时,将默认使用latest标签因此,FROM ubuntu指令等同于FROM ubuntu:latest当时,当镜像更新时,latest 标签会指向不同的镜像,这时构建镜像有可能失败如果你的确需要使用最新版的基础镜像,可以使用 latest 标签,否则的话,最好指定确定的镜像标签。

示例 Dockerfile 应该使用16.04作为标签FROM ubuntu:16.04 # its that easy!RUN apt-get update && apt-get install -y nodejs。

ADD . /appRUN cd /app && npm installCMD npm start5. 每个 RUN 指令后删除多余文件假设我们更新了 apt-get 源,下载,解压并安装了一些软件包,它们都保存在

/var/lib/apt/lists/目录中但是,运行应用时 Docker 镜像中并不需要这些文件我们最好将它们删除,因为它会使 Docker 镜像变大示例 Dockerfile 中,我们可以删除/var/lib/apt/lists/

目录中的文件 (它们是由 apt-get update 生成的)FROM ubuntu:16.04RUN apt-get update \&& apt-get install -y nodejs \# added lines

&& rm -rf /var/lib/apt/lists/*ADD . /appRUN cd /app && npm installCMD npm start6. 选择合适的基础镜像 (alpine 版本最好)

在示例中,我们选择了ubuntu作为基础镜像但是我们只需要运行 node 程序,有必要使用一个通用的基础镜像吗?node镜像应该是更好的选择FROM nodeADD . /app# we dont need to install node。

# anymore and use apt-getRUN cd /app && npm installCMD npm start更好的选择是 alpine 版本的node镜像alpine 是一个极小化的 Linux 发行版,只有 4MB,这让它非常适合作为基础镜像。

FROM node:7-alpineADD . /appRUN cd /app && npm installCMD npm startapk 是 Alpine 的包管理工具它与apt-get有些不同,但是非常容易上手。

另外,它还有一些非常有用的特性,比如no-cache和–virtual选项,它们都可以帮助我们减少镜像的大小7. 设置 WORKDIR 和 CMDWORKDIR 指令可以设置默认目录,也就是运行RUN。

/CMD/ENTRYPOINT指令的地方CMD 指令可以设置容器创建是执行的默认命令另外,你应该讲命令写在一个数组中,数组中每个元素为命令的每个单词 (参考官方文档)FROM node:7-alpine。

WORKDIR /appADD . /appRUN npm installCMD [“npm”, “start”]8. 使用 ENTRYPOINT (可选)ENTRYPOINT 指令并不是必须的,因为它会增加复杂度。

ENTRYPOINT是一个脚本,它会默认执行,并且将指定的命令错误其参数它通常用于构建可执行的 Docker 镜像entrypoint.sh 如下:#!/usr/bin/env sh# $0 is a script name,。

# $1, $2, $3 etc are passed arguments# $1 is our commandCMD=$1case “$CMD” in”dev” )npm installexport NODE_ENV=development

exec npm run dev;;”start” )# we can modify files here, using ENV variables passed in# “docker create” command. It cant be done during build process.

echo “db: $DATABASE_ADDRESS” >> /app/config.ymlexport NODE_ENV=productionexec npm start;;* )# Run custom command. Thanks to this line we can still use

# “docker run our_image /bin/bash” and it will workexec $CMD ${@:2};;esac示例 Dockerfile:FROM node:7-alpine

WORKDIR /appADD . /appRUN npm installENTRYPOINT [“./entrypoint.sh”]CMD [“start”]可以使用如下命令运行该镜像:# 运行开发版本

docker run our-app dev# 运行生产版本docker run our-app start# 运行bashdocker run -it our-app /bin/bash9. 在 entrypoint 脚本中使用 exec

在前文的 entrypoint 脚本中,我使用了exec命令运行 node 应用不使用exec的话,我们则不能顺利地关闭容器,因为 SIGTERM 信号会被 bash 脚本进程吞没exec命令启动的进程可以取代脚本进程,因此所有的信号都会正常工作。

10. COPY 与 ADD 优先使用前者COPY 指令非常简单,仅用于将文件拷贝到镜像中ADD 相对来讲复杂一些,可以用于下载远程文件以及解压压缩包 (参考官方文档)FROM node:7-alpine。

WORKDIR /appCOPY . /appRUN npm installENTRYPOINT [“./entrypoint.sh”]CMD [“start”]11. 合理调整 COPY 与 RUN 的顺序

我们应该把变化最少的部分放在 Dockerfile 的前面,这样可以充分利用镜像缓存示例中,源代码会经常变化,则每次构建镜像时都需要重新安装 NPM 模块,这显然不是我们希望看到的因此我们可以先拷贝package.json

,然后安装 NPM 模块,最后才拷贝其余的源代码这样的话,即使源代码变化,也不需要重新安装 NPM 模块FROM node:7-alpineWORKDIR /appCOPY package.json /app。

RUN npm installCOPY . /appENTRYPOINT [“./entrypoint.sh”]CMD [“start”]12. 设置默认的环境变量,映射端口和数据卷运行 Docker 容器时很可能需要一些环境变量。

在 Dockerfile 设置默认的环境变量是一种很好的方式另外,我们应该在 Dockerfile 中设置映射端口和数据卷示例如下:FROM node:7-alpineENV PROJECT_DIR=/app

WORKDIR $PROJECT_DIRCOPY package.json $PROJECT_DIRRUN npm installCOPY . $PROJECT_DIRENV MEDIA_DIR=/media \

NODE_ENV=production \APP_PORT=3000VOLUME $MEDIA_DIREXPOSE $APP_PORTENTRYPOINT [“./entrypoint.sh”]CMD [“start”]

ENV 指令指定的环境变量在容器中可以使用如果你只是需要指定构建镜像时的变量,你可以使用 ARG 指令13. 使用 LABEL 设置镜像元数据使用 LABEL 指令,可以为镜像设置元数据,例如镜像创建者。

或者镜像说明旧版的 Dockerfile 语法使用 MAINTAINER 指令指定镜像创建者,但是它已经被弃用了有时,一些外部程序需要用到镜像的元数据,例如 nvidia-docker 需要用到com.nvidia.volumes.needed。

示例如下:FROM node:7-alpineLABEL maintainer “jakub.skalecki@example.com”…14. 添加 HEALTHCHECK运行容器时,可以指定–restart always

选项这样的话,容器崩溃时,Docker 守护进程 (docker daemon) 会重启容器对于需要长时间运行的容器,这个选项非常有用但是,如果容器的确在运行,但是不可 (陷入死循环,配置错误) 用怎么办?使用 HEALTHCHECK 指令可以让 Docker 周期性的检查容器的健康状况。

我们只需要指定一个命令,如果一切正常的话返回 0,否则返回 1对 HEALTHCHECK 感兴趣的话,可以参考这篇博客示例如下:FROM node:7-alpineLABEL maintainer “jakub.skalecki@example.com”

ENV PROJECT_DIR=/appWORKDIR $PROJECT_DIRCOPY package.json $PROJECT_DIRRUN npm installCOPY . $PROJECT_DIR

ENV MEDIA_DIR=/media \NODE_ENV=production \APP_PORT=3000VOLUME $MEDIA_DIREXPOSE $APP_PORTHEALTHCHECK CMD curl –fail http://localhost:$APP_PORT || exit 1

ENTRYPOINT [“./entrypoint.sh”]CMD [“start”]当请求失败时,curl –fail命令返回非 0 状态-END-如果看到这里,说明你喜欢这篇文章,请 同时 标星(置顶)本公众号可以第一时间接受到博文推送。

最近整理一份面试资料《Java技术栈学习手册》,覆盖了Java技术、面试题精选、Spring全家桶、Nginx、SSM、微服务、数据库、数据结构、架构等等。

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
相关推荐
评论 共1条
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片
    • 头像gate io giriş0