首页
About Me
推荐
weibo
github
Search
1
linuxea:gitlab-ci之docker镜像质量品质报告
49,451 阅读
2
linuxea:如何复现查看docker run参数命令
23,044 阅读
3
Graylog收集文件日志实例
18,580 阅读
4
linuxea:jenkins+pipeline+gitlab+ansible快速安装配置(1)
18,275 阅读
5
git+jenkins发布和回滚示例
18,181 阅读
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/logs
Open-Falcon
Prometheus
victoriaMetrics
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
互联咨询
最后的净土
软件交付
持续集成
gitops
devops
登录
Search
标签搜索
kubernetes
docker
zabbix
Golang
mariadb
持续集成工具
白话容器
elk
linux基础
nginx
dockerfile
Gitlab-ci/cd
最后的净土
基础命令
gitops
jenkins
docker-compose
Istio
haproxy
saltstack
marksugar
累计撰写
690
篇文章
累计收到
139
条评论
首页
栏目
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/logs
Open-Falcon
Prometheus
victoriaMetrics
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
互联咨询
最后的净土
软件交付
持续集成
gitops
devops
页面
About Me
推荐
weibo
github
搜索到
12
篇与
的结果
2019-02-07
linuxea:如何使用docker和docker-compose的Entrypoint
Entrypoint设置在运行容器时将首先执行的命令和参数。在本教程中,我将解释Docker的Entrypoint指令如何工作以及如何在Dockerfiles和Docker Compose中使用它。这还将介绍一些最佳实践和想法,以便你了解更多信息。Entrypoint可以做什么Entrypoint设置在运行容器时将首先执行的命令和参数。传递给的任何命令行参数docker run <image>都将附加到entrypoint命令,并将覆盖使用的所有指定元素CMD。例如,docker run <image> bash将命令参数添加bash到入口点的末尾。Dockerfile ENTRYPOINTDockerfiles使用全部大写字母作为入口点指令。有几种方法可以定义它。exec语法该exec的形式是,你所指定的命令和参数作为一个"JSON数组"。这意味着你需要使用双引号而不是单引号。ENTRYPOINT ["executable", "param1", "param2"]使用此语法,Docker将不使用命令shell,这意味着不会发生正常的shell处理。如果需要shell处理功能,则可以使用shell命令启动JSON"数组"。ENTRYPOINT [ "sh", "-c", "echo $HOME" ]使用ENTRYPOINT脚本另一种选择是使用脚本来运行容器的入口点命令。按照惯例,它通常包含名称中的入口点。在此脚本中,你可以设置应用程序以及加载任何配置和环境变量。下面是一个如何使用ENTRYPOINT exec语法在Dockerfile中运行它的示例。COPY ./docker-entrypoint.sh / ENTRYPOINT ["/docker-entrypoint.sh"] CMD ["postgres"]例如,Postgres官方图像使用以下脚本作为其ENTRYPOINT:#!/bin/bash set -e if [ "$1" = 'postgres' ]; then chown -R postgres "$PGDATA" if [ -z "$(ls -A "$PGDATA")" ]; then gosu postgres initdb fi exec gosu postgres "$@" fi exec "$@"我们还可以使用CMD的方式,你可以在linuxea:白话容器之dockerfile CMD/entrypoint详解3(20)中和linuxea:docker run与exec的使用差异查看docker compose entrypoint你在Docker Compose文件中使用的指令是相同的,除了你使用小写字母。entrypoint: /code/entrypoint.sh你还可以在docker-compose.yml中使用列表定义入口点。entrypoint: - php - -d - zend_extension=/usr/local/lib/php/xdebug.so - -d - memory_limit=-1 - vendor/bin/phpunit覆盖entrypoint你可以使用该--entrypoint标志覆盖入口点指令。docker run --entrypointdocker-compose run --entrypoint语法最佳实践还有EXEC语法,docker允许shell语法两个中另一个有效的选项ENTRYPOINT和CMD。这将以字符串形式执行此命令并执行变量替换。ENTRYPOINT command param1 param2可以阅读Dockerfile这里参考所述*ENTRYPOINT*是以 shell 形式防止任何*CMD*或*run*使用命令行参数覆盖掉,但是具有缺点*ENTRYPOINT*将被开始作为一个子命令*/bin/sh -c*,其不通过信号。这意味着可执行文件不会是容器*PID 1*- 并且不会收到Unix信号 - 因此你的可执行文件将不会收到*SIGTERM*来自*docker stop <container>*这些内容在linuxea:白话容器之dockerfile CMD/entrypoint详解3(20)中提到过相同的问题,可以参考如果*CMD*用于为*ENTRYPOINT*指令提供默认参数,则应使用JSON数组格式指定*CMD*和*ENTRYPOINT*指令。学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用Bash命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器dockerfile
2019年02月07日
7,895 阅读
0 评论
0 点赞
2019-02-02
linuxea:简单解释docker的端口和端口暴露(EXPOSE)
该Dockerfile指令EXPOSE,Docker run时候可以选择-p和-P,而docker-composeexpose及ports如何连接[[containers]](https://www.docker.com/what-container)在Docker的网络和托管的机器使用。本文将解释这些命令之间的区别以及如何在Dockerfile和docker-compose.yml中有效地使用它们。Docker端口要查看容器上定义的端口列表,可以使用docker port命令。docker port CONTAINER [PRIVATE_PORT[/PROTOCOL]]它列出了所有端口映射或Docker容器的特定映射。docker port test_container 7890/tcp -> 0.0.0.0:4321 9876/tcp -> 0.0.0.0:1234 docker port test_container 7890/tcp 0.0.0.0:4321Dockerfile EXPOSE与publish暴露(EXPOSE)在编写Dockerfiles时,指令EXPOSE告诉Docker正在运行的容器侦听特定的网络端口。这可以作为一种端口映射文档,然后可以在发布端口时使用。EXPOSE <port> [<port>/<protocol>...]你也可以在docker run命令中指定它,例如:docker run --expose=1234 my_app但EXPOSE不允许通过定义的端口与同一网络外的容器或主机进行通信。要允许这种情况发生,你需要发布(publish)端口。Publish端口并将其映射到主机使用docker run命令在容器网络外部发布容器的端口并将它们映射到主机的端口时,可以使用多个标志。这些标志-p和-P,他们在是否要发布一个或所有端口方面不同。要在运行容器时实际发布端口,请使用-p标志on docker run来发布和映射一个或多个端口,或使用-P标志发布所有公开的端口并将它们映射到高阶端口。 - Docker文档:EXPOSEdocker run -p 80:80/tcp -p 80:80/udp my_app在上面的示例中,-p标志后面的第一个数字是主机端口,第二个数字是容器端口。要发布你在Dockerfile中定义的所有端口EXPOSE并将它们绑定到主机,你可以使用该-P标志。docker run -P my_appDocker Compose EXPOSE vs Prot使用Docker Compose定义容器时,docker-compose.yml使用指令expose并ports公开和发布容器的端口。暴露(EXPOSE)就像EXPOSE在Dockerfile中一样,该指令用于公开端口而不将它们发布到主机 - 它们只能被同一网络上的链接服务访问。expose: - "3000" - "8000"ports这用于将端口发布到主机。你可以使用简短的语法,也可以提供更详细的配置。指定ports(HOST:CONTAINER)或仅指定容器端口(选择短暂的主机端口)。ports: - "3000" - "8000:8000/tcp" - "127.0.0.1:8001:8001"长格式语法允许配置无法以简短形式表示的其他字段。target:容器内的端口published:公开暴露的portprotocol:端口协议(tcp或udp)mode:host用于在每个节点上发布主机端口,或者ingress用于负载平衡的群集模式端口。ports: - target: 80 published: 8080 protocol: tcp mode: host了解更多更多官方文档,请查阅如下,你也可以关注本站Docker命令:端口Docker文档:Dockerfile EXPOSEDocker Docs:Docker撰写公开Docker Docs:Docker撰写端口学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助您更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器
2019年02月02日
8,828 阅读
0 评论
0 点赞
2019-01-31
linuxea:docker中运行bash或其他命令
一旦定义了image和Dockerfile,你就可能想要输入容器ID或者名称来运行bash或者其他命令,根据所使用的docker还是docker-compose,有几种不同的方法可以执行此操作。使用docker run创建容器并在其中运行命令,或使用docker exec在现有容器中运行命令。有关这些的更多说明可以在我的博客帖子中阅读:linuxea:docker run与exec的使用差异docker假设你知道容器的名称,或者如果你运行docker ps列出正在运行的进程并复制容器名称...使用docker run或使用docker exec和-i(interactive)标志来保持stdin打开并-t分配终端。docker exec -i -t container_name /bin/bash它也可以是这样docker exec -it container_name /bin/bash运行一个或多个命令:docker exec -ti my_container sh -c "echo 1 && echo 2"docker-compose等效命令docker-compose run和docker-compose exec自动分配终端,因此你只需运行以下命令即可获得交互式提示:docker-compose exec container_name sh相同的结构适用于运行任何命令:docker-compose exec <container name> <command>要一起运行一串命令,它们必须连接到shell。例如:docker-compose exec <name in yml> sh -c '<command 1> && <command 2> && <command 3>' 了解更多现在,你应该能够在docker容器中使用命令行指令。例如,你可以导航文件结构,查看文件,复制或替换容器中的文件 - 这对调试或自定义配置文件非常有用。要了解更多信息,请参阅Docker文档和我的其他帖子。Docker docs:execDocker-compose docs:exec学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用Bash命令可以帮助您更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器
2019年01月31日
4,767 阅读
0 评论
0 点赞
2019-01-29
linuxea:docker run与exec的使用差异
run命令和exec是容器的执行命令,但是他们之间存在很大的差异run使用此命令在新容器中运行一条命令。它适合没有容器运行的情况,并且你想要创建一个容器,启动它然后在其上运行一个进程。docker run [OPTIONS] IMAGE [COMMAND] [ARG...]在docker run命令之后,必须指定image从中创建容器,但也可以传递可选参数。例如:docker run --name linuxea_bash --rm -i -t ubuntu bash这将创建一个名为的容器linuxea_bash并启动Bash会话。该示例中使用的选项和参数的更详细分类如下:--name 在这种情况下,为容器指定一个名称 linuxea_bash--rm像bash命令一样,rm它会删除容器,但是这是在当它退出时-i简而言之-interactive,这确保即使没有连接到正在运行的容器,STDIN也会保持打开状态-t,也可以引用-tty ,bash在容器中启动交互式shell容器的images取决于你使用什么,这里image是ubuntuimage后面的最后一部分是您要运行的命令:bashEXEC这适用于要在现有容器中运行命令的情况。如果你已经有一个容器正在运行并希望更改它或从中获取某些内容,那么这样做会更好。例如,如果正在使用docker-compose,则可能会启动多个容器,并且你可能希望在创建它们后访问其中的一个或多个容器。docker exec [OPTIONS] CONTAINER COMMAND [ARG...]这里的选项-it具有与之相同的效果run。更多选项和参数的示例是:docker exec -d -w /temp linuxea_bash touch my_file.sh-w 后跟目录或文件路径允许你,说明要在哪个工作目录中运行命令。-d或-detached表示容器将以分离模式运行,因此您仍可以继续将终端会话与在后台运行的容器一起使用。如果要查看容器发送到STDOUT的内容,请不要使用此选项。该命令touch用于在正在运行的容器linuxea_bash.sh的/temp目录中创建名称文件my_file.sh除这两个命令之外,还有其他docker命令也有一些细微的差别,如run与build,create的相似之处延伸阅读:docker exec docker run学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用Bash命令可以帮助您更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器
2019年01月29日
3,075 阅读
0 评论
0 点赞
2019-01-12
linuxea:白话容器之dockerfile CMD/entrypoint详解3(20)
此前的RUN和CMD,我们知道,RUN是构建的时候运行的命令,在镜像完成后RUN就运行结束。随后推送到仓库中,这些RUN命令是不会在进行运行的。- init在Docker上下文中,一个Docker只会运行一个应用程序,那么应该运行那个程序,又是什么应用?一般情况下,能拥有生产能力的应用通常在宿主机上一般表现是运行在后台守护进程程序,如:mysql,nginx等。这些服务在运行时候,都是以某个进程运行。某个进程都应该是某个进程的子进程,除init之外,而init是由内核启动的,一般我们在启动一个进程的时候,是以shell的子进程运行的,在命令行下创建的任何进程都是shell的子进程,而有一些经常也会直接占据shell的终端设备,就算使用&放置后台,启动的父进程也仍然是shell。进程终止的时候会将所有的子进程销毁,这种情况下我们会使用nohub command &,这样一来就类似于将启动的进程init那么在Docker中运行的init进程(init的id是1)是由内核启动,还是托管shell启 动。如果基于内核启动 ls /etc/* ,|等shell特性是无法使用的,那么如果基于shell启动,那init的id就不再是1了exec假如想基于shell的方式来启动一个主进程,那么shell的id号就是1,而后基于此在启动主进程,但是这样一来shell就不能退出,那可能需要一种能够剥离终端的方式启动,但是剥离了终端的方式启动,主进程号又不是1了。不过,我们可以使用exec来解决,shell启动是没有问题,进程号id是1也没有关系,exec顶替shell的id为1,取代shell进程,shell退出后exec就成了id为1的进程。在很多时候,在容器内启动一个应用程序的时候可以不基于shell,直接启动也可以,也可以基于shell,如果基于shell启动,并且不违背shell主进程id为1的调节关系,那么就可以使用第二种方式,exec。CMDRUN是构建的镜象build时候执行的,而cmd是定义一个镜象文件启动为容器时候默认要运行的程序,而Docker容器默认运行一个程序,在运行CMD的时候,是可以写多条CMD的,而最后一条CMD是生效的。而RUN是可以从上倒下接多RUN命令逐一运行。CMD类属于RUN命令,CMD指令也可以用于运行任何命令或应用程序,不过,二者的运行时间点不同RUN指令运行与映像文件构建过程中,而CMD指令运行于基于Dockerfile构建出的新映像文件启动一个容器时CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且运行结束后,容器也将终止;不过,CMD指令的命令其可以被Docker run命令选项所覆盖在Dockerfile中可以存在多个CMD指令,但仅最后一个会生效命令CMD <command> CMD ["<executable>","<paraml>","<param2>"] CMD ["<param1>","<param2>"]前两种语法格式的意义同RUN第一种的CMD的命令执行是直接写命令的,并且PID不为1,也无法接收信号(接收信号的必然是pid为1的超级管理进程),docker stop也无法停止。第二种直接启动为ID为1的进程,可接受处理shell信号的。第三种则用于ENTRYPOINT指令提供默认参数编写Dockerfile如,创建目录后追加文件,最后用CMD直接调用httpd启动FROM busybox LABEL maintainer="linuxea.com" app="CMD" ENV WEB_ROOT="/data/wwwroot" RUN mkdir -p ${WEB_ROOT} \ && echo '<h1> helo linuxea .</h1>' >> ${WEB_ROOT}/index.html CMD /bin/httpd -f -h ${WEB_ROOT}开始build[root@linuxEA /data/linuxea2]$ docker build -t marksugar/httpd:9 Sending build context to Docker daemon 2.048kB Step 1/5 : FROM busybox ---> 59788edf1f3e Step 2/5 : LABEL maintainer="linuxea.com" app="CMD" ---> Running in b6e91f2461dd Removing intermediate container b6e91f2461dd ---> 53559ed7015a Step 3/5 : ENV WEB_ROOT="/data/wwwroot" ---> Running in 3e615febfd44 Removing intermediate container 3e615febfd44 ---> a7917cb7ecbb Step 4/5 : RUN mkdir -p ${WEB_ROOT} && echo '<h1> helo linuxea .</h1>' >> ${WEB_ROOT}/index.html ---> Running in 15153c929109 Removing intermediate container 15153c929109 ---> 8e5548f3c00a Step 5/5 : CMD /bin/httpd -f -h ${WEB_ROOT} ---> Running in feeb34a9c423 Removing intermediate container feeb34a9c423 ---> a091b6d8a31d Successfully built a091b6d8a31d Successfully tagged marksugar/httpd:9从这里可以看到,这条启动命令是/bin/sh启动的子进程,在此后启动的时候会替换成id1,也就是默认执行exec将/bin/sh替换掉[root@linuxEA /data/linuxea2]$ docker inspect marksugar/httpd:9 ... "Cmd": [ "/bin/sh", "-c", "/bin/httpd -f -h ${WEB_ROOT}" ... 而后run起来,但是这里是没有交互式接口的,尽管使用了-it[root@linuxEA /data/linuxea2]$ docker run --name linuxea --rm -it marksugar/httpd:9 不过,可以使用exec进入容器,/bin/httpd -f -h /data/wwwroot的id为1我们在Dockerfile中直接使用命令的方式避免他不是1,那么这里就直接启动为1,默认执行力exec替换。这也就说明了,尽管使用-it仍然进入不了容器的原因,init1的进程不是shell。进入就要在使用exec绕过进入[root@linuxEA ~]$ docker exec -it linuxea sh / # ps aux PID USER TIME COMMAND 1 root 0:00 /bin/httpd -f -h /data/wwwroot 7 root 0:00 sh 13 root 0:00 ps aux / # 第二种格式CMD ["/bin/httpd","-f","-h ${WEB_ROOT}"]以这种方式进行buildFROM busybox LABEL maintainer="linuxea.com" app="CMD" ENV WEB_ROOT="/data/wwwroot" RUN mkdir -p ${WEB_ROOT} \ && echo '<h1> helo linuxea .</h1>' >> ${WEB_ROOT}/index.html #CMD /bin/httpd -f -h ${WEB_ROOT} CMD ["/bin/httpd","-f","-h ${WEB_ROOT}"]启动就会报错No such file[root@linuxEA /data/linuxea2]$ docker run --name linuxea --rm -it marksugar/httpd:10 httpd: can't change directory to ' ${WEB_ROOT}': No such file or directory报错No such file是因为CMD ["/bin/httpd","-f","-h ${WEB_ROOT}"]并不会运行成shell的子进程,而此变量是shell的变量,内核却不知道这个路径,所以会报错。不过,我们可以指定为shell,如: CMD ["/bin/sh","-c","/bin/httpd","-f","-h ${WEB_ROOT}"]引言此前我们使用一条命令运行容器的时候,CMD的指令是可以被覆盖的,如下[root@linuxEA ~]$ docker run --name linuxea --rm -it marksugar/httpd:9 ls /etc group hosts mtab passwd shadow hostname localtime network resolv.conf上面这条命令是说,运行这个容器,ls /etc覆盖了此前镜像中的CMD中的启动httpd的命令。但是有时候我们不希望被覆盖,就使用ENTRYPOINTENTRYPOINT类似于CMD指令的功能,用于为容器指定默认的运行程序,从而使得容器像是一个单独的可执行文件与CMD不同的是由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指令的指定程序 不过,docker run命令--entrypoint选项参数可覆盖ENTRYPOINT指令指定的程序ENTRYPOINT <command> ENTRYPOINT ["<executable>","<param1>","<param2>"]docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为其参数使用Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个生效我们先编写一个Dockerfile,使用NETRYPOINT启动FROM busybox LABEL maintainer="linuxea.com" app="CMD" ENV WEB_ROOT="/data/wwwroot" RUN mkdir -p ${WEB_ROOT} \ && echo '<h1> helo linuxea .</h1>' >> ${WEB_ROOT}/index.html ENTRYPOINT /bin/httpd -f -h ${WEB_ROOT}而后build[root@linuxEA /data/linuxea2]$ docker build -t marksugar/httpd:11 . Sending build context to Docker daemon 2.048kB Step 1/5 : FROM busybox ---> 59788edf1f3e Step 2/5 : LABEL maintainer="linuxea.com" app="CMD" ---> Using cache ---> 53559ed7015a Step 3/5 : ENV WEB_ROOT="/data/wwwroot" ---> Using cache ---> a7917cb7ecbb Step 4/5 : RUN mkdir -p ${WEB_ROOT} && echo '<h1> helo linuxea .</h1>' >> ${WEB_ROOT}/index.html ---> Using cache ---> 8e5548f3c00a Step 5/5 : ENTRYPOINT /bin/httpd -f -h ${WEB_ROOT} ---> Running in 34c028efac0d Removing intermediate container 34c028efac0d ---> b7be6f74fc65 Successfully built b7be6f74fc65 Successfully tagged marksugar/httpd:11启动是没有问题的[root@linuxEA /data/linuxea2]$ docker run --name linuxea --rm -it marksugar/httpd:11我们获取到这个ip。访问试试[root@linuxEA ~]$ docker inspect -f {{.NetworkSettings.IPAddress}} linuxea 192.168.100.2[root@linuxEA ~]$ curl 192.168.100.2 <h1> helo linuxea .</h1>ENTRYPOINT而后使用CMD的方式同样来覆盖[root@linuxEA /data/linuxea2]$ docker run --name linuxea --rm -it marksugar/httpd:11 ls /etc容器依然运行起来,但我们并没有看到ls /etc的内容。这是因为在run的时候使用了ls /etc并不会替换Dockerfile中ENTRYPOINT的运行命令,只是在ENTRYPOINT命令之后加了ls /etc,而httpd识别不出ls /etc而已 如果一定要进行覆盖,就需要使用--entrypoint,如下:docker run --name linuxea --rm -it --entrypoint "/bin/ls" marksugar/httpd:11 -al /etc[root@linuxEA ~]$ docker run --name linuxea --rm -it --entrypoint "/bin/ls" marksugar/httpd:11 -al /etc total 28 drwxr-xr-x 1 root root 66 Dec 8 09:07 . drwxr-xr-x 1 root root 6 Dec 8 09:07 .. -rw-rw-r-- 1 root root 307 Sep 6 20:11 group -rw-r--r-- 1 root root 13 Dec 8 09:07 hostname -rw-r--r-- 1 root root 177 Dec 8 09:07 hosts -rw-r--r-- 1 root root 127 May 4 2018 localtime lrwxrwxrwx 1 root root 12 Dec 8 09:07 mtab -> /proc/mounts drwxr-xr-x 6 root root 79 Oct 1 22:37 network -rw-r--r-- 1 root root 340 Sep 6 20:11 passwd -rw-r--r-- 1 root root 114 Dec 8 09:07 resolv.conf -rw------- 1 root root 243 Sep 6 20:11 shadow示例ENTRYPOINT此时我们知道ENTRYPOINT是作为入口点的指令,通过exec 指定,指定的命令和参数作为一个JSON数组,那就意味着需要使用双引号而不是单引号ENTRYPOINT ["executable", "param1", "param2"]使用此语法,Docker将不使用命令shell,这意味着不会发生正常的shell处理。如果需要shell处理功能,则可以使用shell命令启动JSON数组。ENTRYPOINT [ "sh", "-c", "echo $HOME" ]另一种选择是使用脚本来运行容器的入口点命令。按照惯例,它通常在名称中包含入口点。在此脚本中,您可以设置应用程序以及加载任何配置和环境变量。下面是一个如何使用ENTRYPOINT exec语法在Dockerfile中运行它的示例。COPY ./docker-entrypoint.sh / ENTRYPOINT ["/docker-entrypoint.sh"] CMD ["postgres"]例如,Postgres官方图像使用以下脚本作为其ENTRYPOINT:#!/bin/bash set -e if [ "$1" = 'postgres' ]; then chown -R postgres "$PGDATA" if [ -z "$(ls -A "$PGDATA")" ]; then gosu postgres initdb fi exec gosu postgres "$@" fi exec "$@"docker-compose 的写法:Docker Compose文件中使用的命令是相同的,除了使用小写字母。entrypoint: /code/entrypoint.sh可以在docker-compose.yml中使用列表定义入口点。entrypoint: - php - -d - zend_extension=/usr/local/lib/php/xdebug.so - -d - memory_limit=-1 - vendor/bin/phpunit不过仍然可可以使用docker run --entrypoint或docker-compose run --entrypoint标记覆盖入口的指令CMD/commandCMD(Dockerfiles)/ command(Docker Compose文件)的主要目的是在执行容器时提供默认值。这些将在入口点之后被附加到入口的参数。例如,如果运行docker run <image>,则将执行Dockerfiles中CMD/所指定的命令和参数command。在Dockerfiles中,可以定义CMD包含可执行文件的默认值。例如:CMD ["executable","param1","param2"]如果省略了可执行文件,则还必须指定一条ENTRYPOINT指令。CMD ["param1","param2"] (作为ENTRYPOINT的默认参数)注意:其中只能有一条CMD指令Dockerfile。如果列出多个CMD,则只有最后一个CMD生效。Docker Compose命令使用Docker Compose时,可以在docker-compose.yml中定义相同的指令,但它以小写形式写成完整的单词command。command: ["bundle", "exec", "thin", "-p", "3000"]覆盖CMD可以覆盖CMD运行容器时指定的命令。docker run rails_app rails console如果指定了参数docker run,那么它们将覆盖指定的默认值CMD。语法最佳实践还有EXEC语法,shell语法两个另一个有效的选项ENTRYPOINT和CMD。这将以字符串形式执行此命令并执行变量替换。ENTRYPOINT command param1 param2 CMD command param1 param2CMD应该几乎总是以形式使用CMD [“executable”, “param1”, “param2”…]。因此,如果镜象是用于服务的,例如Apache和Rails,那么你可以运行类似的东西CMD ["apache2","-DFOREGROUND"]`。实际上,建议将这种形式的指令用于任何基于服务的镜象。所述*ENTRYPOINT*shell形式防止任何*CMD*或*run*被使用命令行参数覆盖,但是有缺点,*ENTRYPOINT*将被开始作为一个子命令*/bin/sh -c*,其不通过信号。这意味着可执行文件将不是容器*PID 1*- 并且不会收到Unix信号 - 因此您的可执行文件将不会收到*SIGTERM*来自*docker stop <container>*如果*CMD*用于为*ENTRYPOINT*指令提供默认参数,则应使用JSON数组格式指定*CMD*和*ENTRYPOINT*指令。BothCMD和ENTRYPOINTinstructions指定运行容器时执行的命令。很少有规则描述它们如何相互作用。Dockerfiles应至少指定一个CMD或ENTRYPOINT命令。ENTRYPOINT 应该在将容器用作可执行文件时定义。CMD应该用作定义ENTRYPOINT命令的默认参数或在容器中执行ad-hoc命令的方法。CMD 在使用替代参数运行容器时将被覆盖。延伸阅读 :https://docs.docker.com/engine/reference/builder/ https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ https://docs.docker.com/engine/reference/builder/#usage https://docs.docker.com/compose/compose-file/ https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
2019年01月12日
3,869 阅读
0 评论
0 点赞
1
2