首页
常用命令
About Me
推荐
weibo
github
Search
1
linuxea:gitlab-ci之docker镜像质量品质报告
48,996 阅读
2
linuxea:如何复现查看docker run参数命令
20,462 阅读
3
Graylog收集文件日志实例
18,021 阅读
4
git+jenkins发布和回滚示例
17,602 阅读
5
linuxea:jenkins+pipeline+gitlab+ansible快速安装配置(1)
17,574 阅读
ops
Openvpn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack
Open-Falcon
Prometheus
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
音乐
影视
music
Internet Consulting
最后的净土
软件交付
持续集成
gitops
devops
登录
Search
标签搜索
kubernetes
docker
zabbix
Golang
mariadb
持续集成工具
白话容器
linux基础
nginx
elk
dockerfile
Gitlab-ci/cd
最后的净土
基础命令
jenkins
docker-compose
gitops
haproxy
saltstack
Istio
marksugar
累计撰写
676
篇文章
累计收到
140
条评论
首页
栏目
ops
Openvpn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack
Open-Falcon
Prometheus
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
音乐
影视
music
Internet Consulting
最后的净土
软件交付
持续集成
gitops
devops
页面
常用命令
About Me
推荐
weibo
github
搜索到
19
篇与
dockerfile
的结果
2019-03-08
linuxea:如何单单修改docker容器的系统时间
一般情况下,我们仅仅需要修改容器的时间与我们宿主机的实际实际一致即可,我们知道,默认情况下docker容器是不允许访问系统时钟,但是有一款开源的软件使这样的需求变成了可能。此lib拦截用于检索当前时间和日期的所有系统调用,完成了容器内时间的修改。阅读此篇文章,你将了解在容器内修改时间的方法。使用以alpine为例,我们进行编译安装,并挑选几个简单的使用方法来进行演示这个时间调整git clone https://github.com/wolfcw/libfaketime.git cd libfaketime/src make install他的使用非常简单,只需要设置环境变量即可,如下bash-4.4$ date Fri Mar 8 15:17:52 CST 2019修改天数bash-4.4$ LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="-2d"bash-4.4$ date Wed Mar 6 15:28:03 CST 2019修改分钟bash-4.4$ LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="-70m"bash-4.4$ date Fri Mar 8 14:18:45 CST 2019虚拟时间的默认规范是缓存的,时间为10秒钟FAKETIME_NO_CACHE =1是禁用缓存,但这可能带来性能影响嵌入docker基础镜像中使用此前的基础镜像。在启动脚本中添加TIME_OFFSET变量,顺便修改启动容器进程的id和用户名#!/bin/bash ######################################################################### # File Name: entrypoint.sh # Author: www.linuxea.com # Created Time: Tue 05 Mar 2019 03:59:05 PM CST ######################################################################### USER_ID=${USER_ID:-1101} USER_NAME=${USER_NAME:-www} TIME_OFFSET=${TIME_OFFSET:-FAKETIME_NO_CACHE=1 FAKETIME=""} echo "Starting with UID : $USER_ID And user $USER_NAME" addgroup --gid $USER_ID $USER_NAME adduser -u $USER_ID -S -H -s /bin/bash -g $USER_NAME -G $USER_NAME $USER_NAME -D # useradd --shell /bin/bash -u $USER_ID -o -c "" -m user export HOME=/home/$USER_NAME export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 $TIME_OFFSET exec /usr/local/bin/gosu $USER_NAME "$@"这样以来,在下次启动的时候,传递环境变量就达到了修改容器时间的办法我将次镜像构建为marksugar/alpine:3.9-time-gosu,你可以下载进行使用[root@linuxea.com /opt/2019/djd/jj]# docker build -t marksugar/alpine:3.9-time-gosu .现在我们进行测试这个时间修改挂载/etc/localtime让容器时间与机器时间一致,而后在进行传递$TIME_OFFSET修改时间的偏移量docker run \ --rm \ -v /etc/localtime:/etc/localtime \ -e TIME_OFFSET=FAKETIME="-10m" \ -e USER_ID=1101 \ -e USER_NAME=linuxea.com \ -it marksugar/alpine:3.9-time-gosu \ date +%F" "%T我们先取出时间[root@linuxea.com ~]# date +%F" "%T 2019-03-08 15:54:11而后修改分钟,减去10分钟,-10m[root@linuxea.com ~]# docker run \ > --rm \ > -v /etc/localtime:/etc/localtime \ > -e TIME_OFFSET=FAKETIME="-10m" \ > -e USER_ID=1101 \ > -e USER_NAME=linuxea.com \ > -it marksugar/alpine:3.9-time-gosu \ > date +%F" "%T Starting with UID : 1101 And user linuxea.com 2019-03-08 15:44:16时间从2019-03-08 15:54:11变成2019-03-08 15:44:16修改天数,减去3天,-3d[root@linuxea.com ~]# docker run \ > --rm \ > -v /etc/localtime:/etc/localtime \ > -e TIME_OFFSET=FAKETIME="-3d" \ > -e USER_ID=1101 \ > -e USER_NAME=linuxea.com \ > -it marksugar/alpine:3.9-time-gosu \ > date +%F" "%T Starting with UID : 1101 And user linuxea.com 2019-03-05 15:57:43或者这样docker run \ --rm \ -v /etc/localtime:/etc/localtime \ -e TIME_OFFSET=FAKETIME="-10m" \ -e USER_ID=1101 \ -e USER_NAME=linuxea.com \ -it marksugar/alpine:3.9-time-gosu \ date +%F" "%TFAKETIME_NO_CACHE=1[root@DT_Node-172_17_0_1 ~]# date +%F" "%T 2019-03-08 16:03:18[root@DT_Node-172_17_0_1 ~]# docker run \ > --rm \ > -v /etc/localtime:/etc/localtime \ > -e TIME_OFFSET="FAKETIME_NO_CACHE=1 FAKETIME="-10m"" \ > -e USER_ID=1101 \ > -e USER_NAME=linuxea.com \ > -it marksugar/alpine:3.9-time-gosu \ > date +%F" "%T Starting with UID : 1101 And user linuxea.com 2019-03-08 15:53:18更多阅读linuxea:docker卷和文件系统权限linuxea:docker容器中程序不应该以root用户身份运行linuxea:变量实值与文件变量替换学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器docker-compose
2019年03月08日
5,642 阅读
0 评论
0 点赞
2019-03-07
linuxea:Docker多阶段构建与- target和--cache-from
在这篇文章中,我描述了在无法提供任何层缓存的无服务器主机上构建时,我如何提高容器的构建性能。我使用多阶段构建和远程存储库缓存的组合来避免重复性工作来提高性能。阅读本篇,你将了解--target的使用和--cache-from的使用,更好理解多阶段构建和缓存的利用。我将会在文章末尾放置多阶段构建使用的本站链接note使用--target来构建多级建立的特定阶段,并推动这些镜像传输到远程存储库。在后续构建中,拉出这些镜像并使用作为构建缓存--cache-from我们先来看,一个普通的构建脚本## 镜像版本号 DOCKER_IMAGE_VERSION=20190305_addpjp ## 构建镜像 docker build \ -t marksugar/test:$DOCKER_IMAGE_VERSION \ -t marksugar/test:latest \ -f "./Dockerfile" \ "." ## 推送到仓库 docker push marksugar/test:$DOCKER_IMAGE_VERSION docker push marksugar/test:latest 此bash脚本基于Dockerfile构建docker镜像,使用特定的版本号$DOCKER_IMAGE_VERSION和latest标记镜像tag,而后推送到仓库中,完成构建过程。事实上我们在实际生产中的构建脚本远比这要复杂的多。为此,学习利用--target和--cache-from能提高时间效益--target创建多阶段构建时候,可以为每个构建阶段提供名称,例如,我此刻命名的createfile和linuxea,分别在(准备阶段createfile和最终阶段linuxea):FROM marksugar/alpine:3.9-time-gosu as createfile MAINTAINER www.linuxea.com LABEL maintainer="www.linuxea.com" RUN mkdir /data/ && touch /hello.txt WORKDIR /data FROM marksugar/go:alpine-go1.12 as linuxea MAINTAINER www.linuxea.com LABEL maintainer="www.linuxea.com" COPY linuxea.go /data/linuxea.go WORKDIR /data CMD ["go","run","linuxea.go"] COPY --from=createfile /data/ .通过阶段的名称,可以在后续中引用,并且复制到最后的容器中。为了更好的解释这个,我们还是进行一次构建docker build -t test:1 .并运行[root@linuxea.com /opt/2019/djd/go/go2]# docker run -d -p:1818:8080 test:1 01e07ddc26daf94bc57ddc7d61d5cbe0f530c85792e045126dc501e67e047ac8运行正常,可以被访问[root@linuxea.com /opt/2019/djd/go/go2]# curl 127.0.0.1:8080 20190303 欢迎来到 www.linuxea.com但是,这仅仅只是多阶段构建。此刻,我只想构建其中一个阶段,--target就派上用途了。只构建某个阶段,如linuxea或者createfile,并不全部构建只构建linux的阶段[root@linuxea.com /opt/2019/djd/go/go2]# docker build --target linuxea -t test:linuxea -f "$PWD/Dockerfile" "." [root@linuxea.com /opt/2019/djd/go/go2]# docker run --rm -it test:1 bash Starting with UID : 1101 And user www bash-4.4$ ls linuxea.go bash-4.4$ 只构建createfile阶段[root@linuxea.com /opt/2019/djd/go/go2]# docker build --target createfile -t test:2 -f "$PWD/Dockerfile" "." [root@linuxea.com /opt/2019/djd/go/go2]# docker run --rm -it test:2 bash Starting with UID : 1101 And user www bash-4.4$ pwd /data bash-4.4$ ls /hello.txt /hello.txt如上所示中,两个阶段的构建结果仅限于Dockerfile中的多阶段构建的名称下的内容。我们在往下看。--cache-from默认情况下,在构建Docker镜像时,Docker使用它的构建缓存来检查它是否可以跳过Dockerfile中的任何步骤。该--cache-from参数告诉docker,可用缓存的镜像是什么。如果提供的镜像和当前版本具有相同的图层,则可以获得与在同一台计算机上构建镜像时以相同层构建出更快的速度。例如,简单地想象我们没有使用多阶段构建,因此推送到远程存储库的最终镜像包含所有构建层。不使用--cache-from我们的构建脚本总是必须执行Dockerfile中的每个命令,因为构建缓存将为空:docker build -t marksugar/test:01相反,我们可以--cache-from结合使用docker pull,大概如下:docker pull IMAGES1 || true docker build \ --cache-from IMAGES1 \ -t IMAGE2:Version \ -t IMAGE2:latest \ -f "PATH/Dockefile" \ "." docker push IMAGES2:latest docker push IMAGES2:Version为了更好的测试,我们手动进行build两个镜像做一个简单的测试第一个DockerfileFROM marksugar/alpine:3.9-time-gosu as createfile MAINTAINER www.linuxea.com LABEL maintainer="www.linuxea.com" RUN apk add nginx php RUN mkdir -p /data/wwwroot WORKDIR /data/wwwrootdocker build marksugar/test:01第二个Dockerfile在第二个dockerfile中,我们主要看两层,如下:RUN apk add nginx php RUN mkdir -p /data/wwwrootDockerfile。在dockerfile中的这两层与上一个dockerfile的层是相同的FROM marksugar/alpine:3.9-time-gosu MAINTAINER www.linuxea.com LABEL maintainer="www.linuxea.com" RUN apk add nginx php RUN mkdir -p /data/wwwroot RUN echo '\n\ server {\n\ listen 1080;\n \ root /data/wwwroot;\n \ index index.html;\n \ }\n'\ >> /etc/nginx/conf.d/default.conf \ && echo "hello www.linuxea.com" >> /data/wwwroot/index.html WORKDIR /data/wwwroot CMD ["nginx","-g","'daemon off;'"]builddocker build \ --cache-from marksugar/test:01 \ -t marksugar/test:02 \ -f "$PWD/Dockerfile" \ "."如下:[root@linuxea.com /opt/2019/djd/go/go3]# docker build --cache-from marksugar/test:01 -t marksugar/test:02 -f "$PWD/Dockerfile" "." Sending build context to Docker daemon 2.048kB Step 1/8 : FROM marksugar/alpine:3.9-time-gosu ---> 69cd7c6d7a86 Step 2/8 : MAINTAINER www.linuxea.com ---> Using cache ---> 45e40729aaae Step 3/8 : LABEL maintainer="www.linuxea.com" ---> Using cache ---> 5f10b4ec6e3e Step 4/8 : RUN apk add nginx php ---> Using cache ---> 0fd71721e8ff Step 5/8 : RUN mkdir -p /data/wwwroot ---> Using cache ---> 07066ac12068 Step 6/8 : RUN echo '\nserver {\n listen 1080;\n root /data/wwwroot;\n index index.html;\n }\n'>> /etc/nginx/conf.d/default.conf && echo "hello www.linuxea.com" >> /data/wwwroot/index.html ---> Running in 1aaa3449af16 Removing intermediate container 1aaa3449af16 ---> 434c3dee5d37 Step 7/8 : WORKDIR /data/wwwroot ---> Running in 2ed3ce787ab0 Removing intermediate container 2ed3ce787ab0 ---> 078644925acb Step 8/8 : CMD ["nginx","-g","'daemon off;'"] ---> Running in 065aa5b66fe8 Removing intermediate container 065aa5b66fe8 ---> 81adb261a754 Successfully built 81adb261a754 Successfully tagged marksugar/test:02我们在来对比一下层,你会发现这俩个镜像对于上述相同的RUN命令层,公用一个ID,这将减少我们的构建时间如果你的最终构建的镜像包含所有的docker构建层,这个简单的方法很有效。但在多阶段中可能会出现问题,我们可以使用--target和--cache-from一起使用--target And --cache-from倘若此时,在多构建的基础之上,我们需要重新构建准备阶段和最终的运行阶段我们可能使用这种方式,如下:DOCKER_IMAGE_VERSION=VERSION # 拉取最新的镜像 docker pull marksugar/base:1 || true # 使用最新拉取的镜像作为缓存层 docker build \ --target builder \ --cache-from marksugar/base:1 \ -t marksugar/base:1 \ -f "path/Dockerfile" \ "." # 在拉一个最终的镜像 docker pull marksugar/web:latest || true # 不指定target(构建整个Dockerfile) # 使用刚构建的构建器镜像和拉出的运行时候镜像作为缓存 docker build \ --cache-from marksugar/base:1 \ --cache-from marksuagr/Web:latest \ -t marksugar/web:$DOCKER_IMAGE_VERSION \ -t marksugar/Web:latest \ -f "path/Dockerfile" \ "." # 重新推送 docker push marksugar/Web:$DOCKER_IMAGE_VERSION docker push marskugar/Web:latest docker push marksugar/base:1延伸阅读linuxea:Distroless与多阶段构建linuxea:docker多阶段构建Multi-Stage与Builder对比总结学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器docker-compose
2019年03月07日
5,029 阅读
0 评论
0 点赞
1
2
...
10