当前位置: 首页 > news >正文

贷款网站源码下载公司英文网站多少钱

贷款网站源码下载,公司英文网站多少钱,东莞市建设局网app,东营新闻最新消息今天使用 Dockerfile 定制镜像详解 1.DockerfileFROM 指定基础镜像RUN 执行命令构建镜像 2.COPY 复制文件3.ADD 更高级的复制文件4.CMD 容器启动命令5.ENTRYPOINT 入口点6.ENV 设置环境变量7.ARG 构建参数8.VOLUME 定义匿名卷9.EXPOSE 暴露端口10.WORKDIR 指定工作目录11.USER 指定… 使用 Dockerfile 定制镜像详解 1.DockerfileFROM 指定基础镜像RUN 执行命令构建镜像 2.COPY 复制文件3.ADD 更高级的复制文件4.CMD 容器启动命令5.ENTRYPOINT 入口点6.ENV 设置环境变量7.ARG 构建参数8.VOLUME 定义匿名卷9.EXPOSE 暴露端口10.WORKDIR 指定工作目录11.USER 指定当前用户12.LABEL 为镜像添加元数据13.SHELL 指令 1.Dockerfile Dockerfile 是一个文本文件其内包含了一条条的指令每一条指令构建一层因此每一条指令的内容就是描述该层应当如何构建 还以之前定制 nginx 镜像为例这次我们使用 Dockerfile 来定制 FROM nginx RUN echo h1Hello, Docker!/h1 /usr/share/nginx/html/index.htmlFROM 指定基础镜像 FROM 就是指定 基础镜像因此一个 Dockerfile 中 FROM 是必备的指令并且必须是第一条指令 在 Docker Hub 上有非常多的高质量的官方镜像有可以直接拿来使用的服务类的镜像如 nginx、redis、mongo、mysql、httpd、php、tomcat 等也有一些方便开发、构建、运行各种语言应用的镜像如 node、openjdk、python、ruby、golang 等。可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制 除了选择现有镜像为基础镜像外Docker 还存在一个特殊的镜像名为 scratch。这个镜像是虚拟的概念并不实际存在它表示一个空白的镜像 FROM scratch ...如果你以 scratch 为基础镜像的话意味着你不以任何镜像为基础接下来所写的指令将作为镜像第一层开始存在 RUN 执行命令 RUN 指令是用来执行命令行命令的。由于命令行的强大能力RUN 指令在定制镜像时是最常用的指令之一。其格式有两种 shell 格式RUN 命令就像直接在命令行中输入的命令一样 RUN echo h1Hello, Docker!/h1 /usr/share/nginx/html/index.htmlexec 格式RUN [可执行文件, 参数1, 参数2]这更像是函数调用中的格式 Dockerfile 中每一个指令都会建立一层RUN 也不例外。每一个 RUN 的行为就和刚才我们手工建立镜像的过程一样新建立一层在其上执行这些命令执行结束后commit 这一层的修改构成新的镜像。所以在执行多条命令的场景下最好遵守如下的规范 FROM debian:stretchRUN set -x; buildDepsgcc libc6-dev make wget \ apt-get update \ apt-get install -y $buildDeps \ wget -O redis.tar.gz http://download.redis.io/releases/redis-5.0.3.tar.gz \ mkdir -p /usr/src/redis \ tar -xzf redis.tar.gz -C /usr/src/redis --strip-components1 \ make -C /usr/src/redis \ make -C /usr/src/redis install \ rm -rf /var/lib/apt/lists/* \ rm redis.tar.gz \ rm -r /usr/src/redis \ apt-get purge -y --auto-remove $buildDeps这一组命令的最后添加了清理工作的命令删除了为了编译构建所需要的软件清理了所有下载、展开的文件并且还清理了 apt 缓存文件。这是很重要的一步镜像是多层存储每一层的东西并不会在下一层被删除会一直跟随着镜像。因此镜像构建时一定要确保每一层只添加真正需要添加的东西任何无关的东西都应该清理掉 构建镜像 1、编写dockerfile FROM nginx RUN echo h1Hello, Docker!/h1 /usr/share/nginx/html/index.html2、在 Dockerfile 文件所在目录执行 docker build -t nginx .从命令的输出结果中我们可以清晰的看到镜像的构建过程 镜像构建上下文中的坑 当我们进行镜像构建的时候并非所有定制都会通过 RUN 指令完成经常会需要将一些本地文件复制进镜像比如通过 COPY 指令、ADD 指令等。而 docker build 命令构建镜像其实并非在本地构建而是在服务端也就是 Docker 引擎中构建的。那么在这种客户端/服务端的架构中如何才能让服务端获得本地文件呢 这就引入了上下文的概念。当构建的时候用户会指定构建镜像上下文的路径docker build 命令得知这个路径后会将路径下的所有内容打包然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后展开就会获得构建镜像所需的一切文件 有些初学者在发现 COPY /opt/xxxx /app 不工作后于是干脆将 Dockerfile 放到了硬盘根目录去构建结果发现 docker build 执行后在发送一个几十 GB 的东西极为缓慢而且很容易构建失败。那是因为这种做法是在让 docker build 打包整个硬盘这显然是使用错误 一般来说应该会将 Dockerfile 置于一个空目录下或者项目根目录下。如果该目录下没有所需文件那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker 引擎那么可以用 .gitignore 一样的语法写一个 .dockerignore该文件是用于剔除不需要作为上下文传递给 Docker 引擎的 2.COPY 复制文件 COPY 指令将从构建上下文目录中 源路径 的文件/目录复制到新的一层的镜像内的 目标路径 位置。比如 COPY package.json /usr/src/app/使用 COPY 指令源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等 在使用该指令的时候还可以加上 --chownuser:group 选项来改变文件的所属用户及所属组 COPY --chown55:mygroup files* /mydir/ COPY --chownbin files* /mydir/ COPY --chown1 files* /mydir/ COPY --chown10:11 files* /mydir/如果源路径为文件夹复制的时候不是直接复制该文件夹而是将文件夹中的内容复制到目标路径 3.ADD 更高级的复制文件 ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能 比如 源路径 可以是一个 URL这种情况下Docker 引擎会试图去下载这个链接的文件放到 目标路径 去。下载后的文件权限自动设置为 600 如果 源路径 为一个 tar 压缩文件的话压缩格式为 gzip, bzip2 以及 xz 的情况下ADD 指令将会自动解压缩这个压缩文件到 目标路径 去 Docker 官方的 Dockerfile 最佳实践文档 中要求尽可能的使用 COPY因为 COPY 的语义很明确就是复制文件而已而 ADD 则包含了更复杂的功能其行为也不一定很清晰。最适合使用 ADD 的场合就是所提及的需要自动解压缩的场合 ADD 指令会令镜像构建缓存失效从而可能会令镜像构建变得比较缓慢 4.CMD 容器启动命令 在启动容器的时候需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的 CMD 指令的格式和 RUN 相似也是两种格式 shell 格式CMD 命令exec 格式CMD [“可执行文件”, “参数1”, “参数2”…] 在指令格式上一般推荐使用 exec 格式这类格式在解析时会被解析为 JSON 数组因此一定要使用双引号 而不要使用单引号 如果使用 shell 格式的话实际的命令会被包装为 sh -c 的参数的形式进行执行。比如 CMD echo $HOME在实际执行中会将其变更为 CMD [ sh, -c, echo $HOME ]坑容器执行后就立即退出了 容器内没有后台服务的概念。一些初学者将 CMD 写为 CMD service nginx start然后发现容器执行后就立即退出了。这就是因为没有搞明白前台、后台的概念 对于容器而言其启动程序就是容器应用进程容器就是为了主进程而存在的主进程退出容器就失去了存在的意义从而退出其它辅助进程不是它需要关心的东西 而使用 service nginx start 命令则是希望 init 系统以后台守护进程的形式启动 nginx 服务。而刚才说了 CMD service nginx start 会被理解为 CMD [ sh, -c, service nginx start]因此主进程实际上是 sh。那么当 service nginx start 命令结束后sh 也就结束了sh 作为主进程退出了自然就会令容器退出 正确的做法是直接执行 nginx 可执行文件并且要求以前台形式运行。比如 CMD [nginx, -g, daemon off;]5.ENTRYPOINT 入口点 ENTRYPOINT 的目的和 CMD 一样都是在指定容器启动程序及参数 那么有了 CMD 后为什么还要有 ENTRYPOINT 呢 1、场景一让镜像变成像命令一样使用 假设我们需要一个得知自己当前公网 IP 的镜像 FROM ubuntu:18.04 RUN apt-get update \ apt-get install -y curl \ rm -rf /var/lib/apt/lists/* ENTRYPOINT [ curl, -s, http://myip.ipip.net ]构建镜像 docker build -t myip .我们来尝试直接使用 docker run myip -i $ docker run myip 当前 IPxx.xx.xx.xx 来自纽约市 联信$ docker run myip -i HTTP/1.1 200 OK Server: nginx/1.8.0 Date: Tue, 22 Nov 2016 05:12:40 GMT Content-Type: text/html; charsetUTF-8 Vary: Accept-Encoding X-Powered-By: PHP/5.6.24-1~dotdeb7.1 X-Cache: MISS from cache-2 X-Cache-Lookup: MISS from cache-2:80 X-Cache: MISS from proxy-2_6 Transfer-Encoding: chunked Via: 1.1 cache-2:80, 1.1 proxy-2_6:8006 Connection: keep-alive当前 IPxx.xx.xx.xx 来自纽约市 联信当存在 ENTRYPOINT 后CMD 的内容将会作为参数传给 ENTRYPOINT而这里 -i 就是新的 CMD因此会作为参数传给 curl从而达到了我们预期的效果 2、场景二应用运行前的准备工作 mysql 类的数据库可能需要一些数据库配置、初始化的工作这些工作要在最终的 mysql 服务器运行之前解决 此外可能希望避免使用 root 用户去启动服务从而提高安全性而在启动服务前还需要以 root 身份执行一些必要的准备工作最后切换到服务用户身份启动服务。或者除了服务外其它命令依旧可以使用 root 身份执行方便调试等 这些准备工作是和容器 CMD 无关的无论 CMD 为什么都需要事先进行一个预处理的工作。这种情况下可以写一个脚本然后放入 ENTRYPOINT 中去执行而这个脚本会将接到的参数也就是 CMD作为命令在脚本最后执行。比如官方镜像 redis 中就是这么做的 FROM alpine:3.4 ... RUN addgroup -S redis adduser -S -G redis redis ... ENTRYPOINT [docker-entrypoint.sh]EXPOSE 6379 CMD [ redis-server ]6.ENV 设置环境变量 格式有两种 ENV key valueENV key1value1 key2value2... 定义了环境变量那么在后续的指令中就可以使用这个环境变量。比如在官方 node 镜像 Dockerfile 中就有类似这样的代码 ENV NODE_VERSION 7.2.0RUN curl -SLO https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz \ curl -SLO https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc \ gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ grep node-v$NODE_VERSION-linux-x64.tar.xz\$ SHASUMS256.txt | sha256sum -c - \ tar -xJf node-v$NODE_VERSION-linux-x64.tar.xz -C /usr/local --strip-components1 \ rm node-v$NODE_VERSION-linux-x64.tar.xz SHASUMS256.txt.asc SHASUMS256.txt \ ln -s /usr/local/bin/node /usr/local/bin/nodejs在这里先定义了环境变量 NODE_VERSION其后的 RUN 这层里多次使用 $NODE_VERSION 来进行操作定制。可以看到将来升级镜像构建版本的时候只需要更新 7.2.0 即可Dockerfile 构建维护变得更轻松了 通过环境变量我们可以让一份 Dockerfile 制作更多的镜像只需使用不同的环境变量即可 7.ARG 构建参数 格式ARG 参数名[默认值] 构建参数和 ENV 的效果一样都是设置环境变量。所不同的是ARG 所设置的构建环境的环境变量在将来容器运行时是不会存在这些环境变量的 灵活的使用 ARG 指令能够在不修改 Dockerfile 的情况下构建出不同的镜像 ARG 指令有生效范围如果在 FROM 指令之前指定那么只能用于 FROM 指令中 ARG DOCKER_USERNAMElibrary FROM ${DOCKER_USERNAME}/alpine RUN set -x ; echo ${DOCKER_USERNAME}使用上述 Dockerfile 会发现无法输出 ${DOCKER_USERNAME} 变量的值要想正常输出你必须在 FROM 之后再次指定 ARG # 只在 FROM 中生效 ARG DOCKER_USERNAMElibrary FROM ${DOCKER_USERNAME}/alpine # 要想在 FROM 之后使用必须再次指定 ARG DOCKER_USERNAMElibrary RUN set -x ; echo ${DOCKER_USERNAME}8.VOLUME 定义匿名卷 格式为 VOLUME [“路径1”, “路径2”…]VOLUME 路径 容器运行时应该尽量保持容器存储层不发生写操作对于数据库类需要保存动态数据的应用其数据库文件应该保存于卷(volume)中 为了防止运行时用户忘记将动态文件所保存目录挂载为卷在 Dockerfile 中我们可以事先指定某些目录挂载为匿名卷这样在运行时如果用户不指定挂载其应用也可以正常运行不会向容器存储层写入大量数据 VOLUME /data在这行命令中就使用了 mydata 这个命名卷挂载到了 /data 这个位置替代了 Dockerfile 中定义的匿名卷的挂载配置 9.EXPOSE 暴露端口 格式为 EXPOSE 端口1 [端口2...] EXPOSE 指令是声明容器运行时提供服务的端口这只是一个声明在容器运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处一个是帮助镜像使用者理解这个镜像服务的守护端口以方便配置映射另一个用处则是在运行时使用随机端口映射时也就是 docker run -P 时会自动随机映射 EXPOSE 的端口 要将 EXPOSE 和在运行时使用 -p 宿主端口:容器端口 区分开来 -p是映射宿主端口和容器端口换句话说就是将容器的对应端口服务公开给外界访问而 EXPOSE 仅仅是声明容器打算使用什么端口而已并不会自动在宿主进行端口映射 10.WORKDIR 指定工作目录 格式为 WORKDIR 工作目录路径 使用 WORKDIR 指令可以来指定工作目录以后各层的当前目录就被改为指定的目录如该目录不存在WORKDIR 会帮你建立目录 如果需要改变以后各层的工作目录的位置那么应该使用 WORKDIR 指令例如 WORKDIR /app RUN echo hello world.txt如果你的 WORKDIR 指令使用的相对路径那么所切换的路径与之前的 WORKDIR 有关 WORKDIR /a WORKDIR b WORKDIR c RUN pwdRUN pwd 的工作目录为 /a/b/c 11.USER 指定当前用户 格式USER 用户名[:用户组] WORKDIR 是改变工作目录USER 则是改变之后层的执行 RUN, CMD 以及 ENTRYPOINT 这类命令的身份 USER 只是帮助你切换到指定用户而已这个用户必须是事先建立好的否则无法切换 例如 RUN groupadd -r redis useradd -r -g redis redis USER redis RUN [ redis-server ]另外如果以 root 执行的脚本在执行期间希望改变身份比如希望以某个已经建立好的用户来运行某个服务进程不要使用 su 或者 sudo这些都需要比较麻烦的配置而且在 TTY 缺失的环境下经常出错。建议使用 gosu # 建立 redis 用户并使用 gosu 换另一个用户执行命令 RUN groupadd -r redis useradd -r -g redis redis # 下载 gosu RUN wget -O /usr/local/bin/gosu https://github.com/tianon/gosu/releases/download/1.12/gosu-amd64 \ chmod x /usr/local/bin/gosu \ gosu nobody true # 设置 CMD并以另外的用户执行 CMD [ exec, gosu, redis, redis-server ]12.LABEL 为镜像添加元数据 LABEL 指令用来给镜像以键值对的形式添加一些元数据 语法 LABEL keyvalue keyvalue keyvalue ...我们还可以用一些标签来申明镜像的作者、文档地址等 LABEL org.opencontainers.image.authorsdahezhiquan LABEL org.opencontainers.image.documentationhttps://dahezhiquan.gitbooks.io13.SHELL 指令 SHELL 指令可以指定 RUN ENTRYPOINT CMD 指令的 shellLinux 中默认为 [/bin/sh, -c] SHELL [/bin/sh, -c]RUN lll ; lsSHELL [/bin/sh, -cex]RUN lll ; ls两个 RUN 运行同一命令第二个 RUN 运行的命令会打印出每条命令并当遇到错误时退出
http://www.pierceye.com/news/172518/

相关文章:

  • 如何做黑客攻击网站专业的网站建设运营
  • 门户网站建站流程做网站在哪里做比较好
  • 青创网站首页wordpress用户发文章
  • wordpress 仿站 主题网站建设拍金手指排名贰拾
  • 自己的网站怎么做跳转广州白云建方舱医院
  • 免费搭建购物网站网页游戏网站打不开
  • 专业的东莞网站设计wordpress extra script
  • 嘉兴网站开发公司电话从零开始创建wordpress主题.pdf
  • 备案号怎么添加到网站自己做网站原始代码
  • 可以做exe的网站邯郸做紧固件网站
  • 电子商务网站开发的说法移动端首页尺寸
  • 普通网站服务器房地产营销门户网站开发
  • 免费做公司网站wordpress文章格式
  • 制作网站教学设计金湖县城乡建设局网站
  • 微商城网站建设咨询网站做的不满意
  • 装企工长网站开发互联网营销师考试内容
  • 广州高端网站定制公司哪家好全椒县城乡规划建设局网站
  • 物流网站毕业设计论文论坛网站模板下载
  • 代理上网蜗牛精灵seo
  • 网站怎么做用qq登录接入网络舆情监测分析系统
  • 怎么把几个网站做互通wordpress 英文站
  • 建设高端网站需要多少钱wordpress检测
  • 如何学习网站建设app嘉兴建站软件
  • 驻马店市建设工程网站平面设计培训班学费一般多少百度贴吧
  • 长沙网络建设的网站免费的个人简历模板word下载
  • 网站维护简单吗wordpress绿色两栏响应式主题
  • 二手站网站怎做福州网站建设的公司哪家好
  • dw如何做网站后台佛山行业网站建设
  • 如何做网站轮播大图简单网页制作成品代码
  • 网站怎么做uc整合查企业网站