Docker基础28--6.3 Docker三剑客之compose

6.3 Docker三剑客之compose

Compose项目是Docker官方的开源项目,负责实现对基于Docker容器的多应用服务的快速编排。Compose定位是“定义和运行多个Docker容器的应用”。

Compose中的几个重要的概念:

  1. 任务(task):一个容器被称为一个任务。任务拥有独一无二的ID,在同一个服务中的多个任务序号依次递增。
  2. 服务(service):某个相同应用镜像的容器副本集合,一个服务可以横向扩展为多个容器实例。
  3. 服务栈(stack):由多个服务组成,相互配合完成特定业务,如Web应用服务、数据库服务共同构成Web服务栈,一般由一个docker-compose.yml文件定义。

6.3.1 安装compose

yum install docker-compose

查看一下版本号:

docker-compose version

 

6.3.2 compose模版文件

默认的模板文件名称为docker-compose.yml,格式为YAML格式,目前最新的版本为v3。

模版常用命令

6.3.2.1 version: ““命令

#指定版号,现在我们使用的版本号是3

6.3.2.2 services命令

 #代表以下的内容是服务

6.3.2.3 build命令

#指定Dockerfile所在文件夹的路径(可以是绝对路径,或者相对docker-compose.yml文件的路径),并创建一个镜像.

实验1:使用build创建一个镜像

Step1 创建一个dockerfile

vim dockerfile

 

Step2 创建docker-compose.yml

vim docker-compose.yml

 

version: ‘3’                     #指定版本号为3

services:                       #表示以下内容为定义服务

hello:                          #定义一个名为hello的服务

build: .                         #定义dockerfile在当前目录下

:命令和参数之间需要加空格

然后使用命令拉起

docker-compose up              #需在docker-compose.yml文件所在的目录下执行

 

会创建一个镜像:

 

红框中中test_hello就是我们刚创建的镜像,其中testdocker-compose.yml所在的目录名,hello是服务名.

同时也会创建一个容器:

 

也可以指定一些详细的参数:

 

Context:  /root/dockerlab/compose/test       #指定dockerfile文件所在的目录,该目录也是发送到Docker守护程序构建镜像的上下文。

dockerfile: dockerfile                       #指定dockerfile的文件名

args:                                    #定义两个变量

修改下dockerfile

 

ARG arges1        #定义一个名为ares1的变量(这个变量的值,将会由上面的docker-compose.yml文件中传入

 

注意红框的内容,说明这两个变量已成功传递.

6.3.2.4 image命令

 #指定一个镜像文件

实验1:指定一个名为centos的镜像文件,并创建一个容器

vim docker-compose.yml

 

Docker-compose up

 

6.3.2.5 cap_add,cap_drop命令

 #添加/删除容器的权限

 

这里是增加了一个NET_ADMIN的权限

具体容器权限的含义请参考以下文档:

https://docs.docker.com/engine/reference/run/#/runtime-privilege-and-linux-capabilities

6.3.2.6 command命令

 #覆盖容器启动后默认执行的命令

 

红框中的内容意思是:在容器启动的时候执行bash –c “touch /tmp/1 && ls /tmp/这条命令,也就是先在/tmp下创建一个名为1的文件,再用ls看一下/tmp/中的内容

 

这个文件已经创建好了.

这里证实了command命令已经生效

那么,如果dockerfile里指定了ENTRYPOINTCMD(需要回顾一下2.1.7.4,最终容器会执行哪个呢?让我们来再做一个实验:

 

Dockerfile中指定了一个CMD命令,echo dockerfile

 

模版文件中指定了一个command命令, echo hello docker-compose

我们来观察一下,最终生成的容器,会执行哪一条命令

 

这里我们看到,只会执行command的命令,而dockerfile中的CMD命令不会被执行。

6.3.2.7 container_name命令

#指定容器名称。默认将会使用“项目名称_服务名称_序号”这样的格式。目前不支持在Swarm模式中使用。

 

6.3.2.8entrypoint命令

覆盖容器中默认的入口命令。注意,也会取消掉镜像中指定的入口命令和默认启动命令。

这个是我们学过的第4个容器入口命令了。

我们来回顾一下

  1. dockerfile 中的ENTRYPOINT
  2. dockerfile中的CMD
  3. docker-compose中的command
  4. docker-compose中的entrypoint

dockerfile中的两个入口命令的区别,我们在2.1.7.4小节中已经讲过了。

而在6.3.2.6小节中,我们又验证了command命令的优先级比前两个要高。

那么我们再来看下commandentrypoint的优先级哪下更高

 

在模版文件中这两个命令都指定一下,我们看看,最终容器会执行哪个?

 

这里看到,最终执行的是entrypoint命令。

3.2.2.9environment命令

设置环境变量

这里制定了两个环境变量,env1env2,并在开启的时候显示环境变量。

 

3.2.2.10extends命令

基于其他模板文件进行扩展。

比如我们已经有一了个compose1.xml模版文件,内容如下:

 

这里注意,v3格式不支持,extends,所以我们改成v2格式。

然后我们在docker-compose.xml里可以调用这个文件里的内容

file: compose1.xml   #调用compose1中的内容

service: hello        #调用hello这个服务

 

是可以执行成功的。

3.2.2.11 devices命令

指定设备映射关系,不支持Swarm模式。

 

这里是把宿主机的/dev/sdc这个设备映射到容器中的/dev/sdc

 

在容中内,会出现这个sdc的设备。

3.2.2.12 depends_on 命令

#指定多个服务之间的依赖关系。启动时,会先启动被依赖服务。

 

以上模版文件中,定义了两个服务:hello1,hello2.

并定义了,hello1依赖于hello2.

我们来执行一下看看:

 

这里发现在启动hello1这个服务之前,会先启动hello2这个服务。

3.2.2.13 external_links命令

#链接到其它容器

创建一个名为centos1的容器,并将此容器的网络指定为test_default(用docker-compose创建的容器,默认在这个网络下)

docker run -it --name centos1 --hostname centos1 --network test_default centos bash

 

这里链接到centos1这个容器

最后一行容器启动时执行的命令sleep infinity的意思是让当前的shell永久处理睡眠模式,目的是让容器不要退出。

 

这个docker-compose up后面的-d,是代表让容器在后台运行

 

这里我们可以ping通被链接的那个容器名,说明链接成功。

这里被链接的容器要求和本容器处于一个网络下。

3.2.2.14 links命令

#链接到其他服务中的容器。

 

这里定义了两个服务,hello1这个服务link到了hello2

这样在hello1上就可以直接pinghello2这个服务名了

 

3.2.2.15extra_hosts命令

指定额外的host名称映射信息。

 

这里指定一个主机名为:googlednsIP8.8.8.8

注意:需要将参数用“”引起来。

 

这里发现是可能ping通这个googledns的主机名的。

 

其实就是在容器的/etc/hosts文件里增加了“8.8.8.8 googledns”这一行

3.2.2.16 healthcheck命令

#指定检测应用健康状态的机制,包括检测方法(test)、间隔(interval)、超时(timeout)、重试次数(retries)、启动等待时间(start_period)等。

 

注意红框内,这里要指定几个选项:

test检测方式(有CMDCMD-SHELL两种)

这里的意思是crul –f http://localhost:8080这条命令。

Interval  检测间隔时间

timeout超时时间

retries   重试次数

start period  启动后等待多长时间开始检测。

 

因为我们的容器没开8080端口,所以过一会以后,docker的状态就会变成unhealthy.

3.2.2.17 labels命令

#为容器添加Docker元数据(metadata)信息。例如可以为容器添加辅助说明信息。

 

docker-compose config这个命令,来看一下服务的详细信息

 

3.2.2.18 network_mode命令

设置网络模式。

network_mode: "bridge"  #设置网络模式为bridge

network_mode: "host"      #设置网络模式为host

network_mode: "none"  #设置网络模式为none(禁用所有网络)

network_mode: "service:[service name]"  #共享其它服务的网络命名空间

network_mode: "container:[container name/id]"    #共享其它容器的网络命名空间

 

hello1服务的网络模式设为host

hello2 服务的网络模式共享hello1的网络命令空间。

3.2.2.19 networks命令

所加入的网络。需要在顶级的networks字段中定义具体的网络信息。

如果我们在模版文件中什么网络参数都不配置的话,在up的时候,会自动创建一个以project_default命名的网络。

 

我这边用docker-compose创建了三个项目,就会产生三个网络。

 

且网段都不一样。

我们也可以在模版文件中指定容器的网络。

 

实验1:指定一个默认的自定义网络

Step 1创建一个网络(详见5.3小节)

docker network create mynet --subnet 192.168.100.0/24 --gateway 192.168.100.1

 

这里会创建成功一个名为mynet的网络

Step 2修改模版文件

 

Step 3确认网络配置

将服务up起来以后,观察容器的网络

docker network inspect mynet

 

可以看到hello1hello2这两个容器都在mynet这个网络下了。

如果我们自定义的这个网络名不是default,则需要在每个服务里指定一下。

 

注意红框中的内容,这个效果是一样的。

实验2 利用模块文件来创建自定义网络

 

这里在模版文件中创建一个自定义网络,并指定其网段是192.168.200.0/24

 

这里会产生一个名为test_mynet2的网络,系统会自动在我们定义的网络名前加上project名。

docker network inspect mynet

 

两个容器都在mynet2这个网络下了。

实验3 设置网络别名aliases

 

红框中的意思是,hello2这个服务使用mynet2这个网络,并定义了一个别名。

这样我们在hello1这个服务中,可以直接使用这个别名来和hello2通讯。

 

这个功能有点和3.2.2.14小节那个links命令相似。

3.2.2.20 posts命令

#将宿主机的映射到容器

使用宿主:容器(HOSTCONTAINER)格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。

ports:

  - "3000"                 #宿主机随机一个端口映射到容器的3000端口

  - "8000:8000"            #宿主机的8000端口映射到容器的8000端口

  - "49100:22"             #宿主机的49100端口映射到容器的22端口

- "127.0.0.1:8001:8001"    #宿主机127.0.0.18001端口映射到容器的22端口。

也可以像这样写

ports:

  - target80                       #目标端口(容器端口)

   published8080                  #发布端口(宿主机端口)

   protocoltcp                    #协议(TCP/UDP

   modeingress                   #模式:进入

 

这里将宿主机的8080端口映射到了容器的80端口

 

可以看到已经映射成功

3.2.2.21 secrets命令

配置应用的秘密数据。

可以指定来源秘密、挂载后名称、权限等。

Step1 创建一个文件名为mypassword.txt的文件

echo 123456 > mpassword.txt

 

Step2 修改docker-compose.yml文件

 

第二个红框定义了一个名为mypasswordsecret,内容来致于./mypassword.txt这个文件。

第一个红框是调用这个定义好的secret

Step 3:启动服务,并查看效果

docker-compose exec hello1 cat /run/secrets/mypassword

 

在这个服务的容器中,会出现一个生成一个/run/secrets/mypassword的文件,并且这个文件的内容,就是我们在第一步中创建的那个文件的内容。

3.2.2.22 voloumes命令

数据卷所挂载路径设置。可以设置宿主机路径(HOSTCONTAINER)或加上访问模式(HOSTCONTAINERro|rw

 

红框中的内容是将容器的/tmp映射到宿主机的/tmp上。

使用docker inspect test_hello1_1这个命令可以看到容的挂载情况

 

3.2.3.23 docker-compose模版文件命令一览表

命令

功能

build

指定dockerfile所在文件夹的路径

cap_add,cap_drop

指定容器的内核能力(capacity)分配

command

覆盖容器启动后默认执行的命令

cgroup_parent

指定父cgroup,意味着将继承该组的资源限制。目前不支持swarm模式

container_name

指定容器名称。目前不支持swarm模式

depends_on

指定多个服务之间的依赖关系

dns

自定义DNS服务器

dns_search

配置DNS搜索域

dockerfile

指定额外的编译镜像的dockerfile文件

entrypoint

覆盖容器中默认的入口命令

env_file

从文件中获取环境变量

environment

设置环境变量

expose

暴露端口,但不映射到宿主机,只被连接的服务访问

extends

基于其它模版文件进行扩展

external_links

链接到docker-compose.yml外部的容器

extra_hosts

指定额外的host名称映射信息

healthcheck

指定检测应用健康状态的机制

image

指定为镜像名称或镜像ID

isolation

配置容器隔离的机制

labels

为容器添加docker元数据信息

links

链接到其它服务中的容器

logging

跟日志相关的配置

network_mode

设置网络模式

networks

所加入的网络

pid

跟主机系统共享进程命名空间

ports

暴露端口信息

secrets

配置应用的秘密数据

security_opt

指定容器模版标签(label)机制的默认属性(用户、角色、类型、级别等)

stop_grace_period

指定应用停止时,容器的优雅停止限期。过期后则通过SIGKILL强制退出。默认值为10s

stop_signal

指定停止容器的信号

sysctls

配置容器内的内核参数。目前不支持swarm模式

ulimits

指定容器的ulimits限制值

userns_mode

指定用户命名空间模式。目前不支持swarm模式

volumes

数据卷所挂载路径设置

restart

指定重启策略

deploy

指定部署和运行时的容器相关配置。该命令只在swarm模式下生效,且只支持docker stack deploy命令部署。

6.3.3 compose命令

docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

-f,--file:指定使用的Compose模板文件,默认为docker-compose.yml

-p,--project-name:指定项目名称,默认将使用所在目录名称作为项目名

--verbose:输出更多调试信息

-v,--version:打印版本信息

-H,--host:指定所要操作的docker服务的主机地址

--tls:启用TLS,如果指定-tlsverify则默认开启

--tlscacert :信任的TLS CA的证书

--tlscert:客户端使用的TLS证书

--tlskey:TLS的私钥文件路径

--tlsverify:使用TLS校验连接对方

--skip-hostname-check:不使用TLS证书校验对方的主机名

--project-directory PATH:指定工作目录,默认为Compose文件所在路径

6.3.3.1compose命令一览表

命令

功能

build

构建或重新构建项目中的容器

bundle

创建一个可分发的配置包,包括整个服务栈的所有数据,它人可以利用该文件启动服务栈

config

查看compose文件的配置信息

down

停止服务栈,并删除相关资源,包括容器、挂载卷、网络、创建镜像等,默认情况下,只清除容器和网络资源

events

实时监控容器的事件信息

exec

在一个运行的容器中,执行一个指定的命令

help

获得一个命令的帮助

images

列出服务所创建的镜像

kill

通过发送SIGKILL信号来强制停止容器服务

logs

查看容器服务的输出

pause

暂停一个服务容器

port

打印某个容器端口所映射的公共端口

ps

列出项目中的所有容器

pull

拉取服务依赖的镜像

push

推送服务创建的镜像到镜像仓库

restart

重启项目中的服务

rm

删除所有(停止状态)的容器

run

在指定服务上执行一条命令

scale

设置指定服务运行容器的个数

start

启动已存在的服务容器

stop

停止已处于运行状态的服务容器,但不删除它

top

显示服务栈中正在运行的进程信息

unpause

恢复暂停的服务

up

尝试自动完成一系列的操作,包括构建镜像、创建(重建)服务,启动服务,并关联服务的相关容器等

version

打印版本信息

6.3.3.2 build命令

构建(重新构建)项目中的服务容器(只会构建或重新构建容器的镜像文件)。

build [options] [--build-arg key=val...] [SERVICE...]

OPTIONS:

--force-rm:强制删除构建过程中的临时容器;

--no-cache:构建镜像过程中不使用,cache(这将加长构建过程);

--pull:始终尝试通过pull来获取更新版本的镜像;

--m,-memory MEM:指定创建服务所使用的内存限制;

--build-arg key=val:指定服务创建时的参数。

docker-compose build

 

创建了两个服务容器的镜像。

6.3.3.3 config命令

打印服务栈的配置信息

docker-compose config  [options]

options:

resolve-image-digests:为镜像添加对应的摘要信息;

-q,--quiet:只检验格式正确与否,不输出内容;

--services:打印出Compose中所有的服务信息;

--volumes:打印出Compose中所有的挂载卷信息;

 

这里会将服务栈的信息打印出来。

6.3.3.4 up命令

自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。

默认情况,如果服务容器已经存在,docker-compose up将会尝试停止容器,然后重新创建,以保证新启动的服务匹配docker-compose.yml文件的最新内容。

docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]

options:

-d:在后台运行服务容器;

--no-color:不使用颜色来区分不同的服务的控制台输出;

--no-deps:不启动服务所链接的容器;

--force-recreate:强制重新创建容器,不能与——no-recreate同时使用;

--no-recreate:如果容器已经存在了,则不重新创建,不能与——force-recreate同时使用;

--no-build:不自动构建缺失的服务镜像;

--abort-on-container-exit:当有容器停止时中止整个服务,与-d选项冲突。

-t--timeout TIMEOUT:停止容器时候的超时(默认为10秒),与-d选项冲突;

--remove-orphans:删除服务中未定义的孤儿容器;

--exit-code-from SERVICE:退出时返回指定服务容器的退出符;

--scale SERVICE=NUM:扩展指定服务实例到指定数目。

 

执行up命令启动服务时,它干了三件事:

  1. 为每个服务创建镜像(上图绿框所示);
  2. 创建容器(上图蓝框所示);
  3. 启动容器(上图红框所示)。

6.3.3.5 down命令

停止服务栈,并删除相关资源,包括容器、挂载卷、网络、创建镜像等。

默认情况下只清除所创建的容器和网络资源。

docker-compose down [options]

options:

-rmi type:指定删除镜像的类型,包括all(所有镜像),local(仅本地);

-v,--volumes:删除挂载数据卷;

--remove-orphans:清除孤儿容器,即未在Compose服务中定义的容器;

--t,-timeout TIMEOUT:指定超时时间,默认为10s。

 

我们看到,执行down命令的时候,做了两件事

  1. 停止容器
  2. 删除容器(但不会删除镜像)

如果使用:docker-compose down --rmi all则会把镜像一块删除。

 

6.3.3.6 events命令

实时监控容器的事件信息

events [options] [SERVICE...]

options:

--json:以Json对象流格式输出事件信息。

6.3.3.7 exec命令

在一个运行中的容器内执行给定命令。

docker-compose exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]

options:

-d:在后台运行命令;

--privileged:以特权角色运行命令;

-u,-user USER:以给定用户身份运行命令;

-T:不分配TTY伪终端,默认情况下会打开;

--index=index:当服务有多个容器实例时指定容器索引,默认为第一个;

-e,-env KEY=VAL:设置环境变量。

docker-compose exec hello1 ps aux    #hello1这个服务容器中执行ps aux这个命令

 

6.3.3.8 images命令

列出服务所创建的镜像。

docker-compose images [options] [SERVICE...]

options:

-q:仅显示镜像的ID。

 

我们这个项目,有两个服务,两个镜像文件。

6.3.3.9 kill命令

通过发送SIGKILL信号来强制停止服务容器。

docker-compose kill [options] [SERVICE...]

options:

-s:指定信号,默认为SIGINT(相当于按ctrl_c)

还有几种常用的信号:

SIGKILL:强制结束

SIGTERM:正常结束

 

6.3.3.10 logs命令

查看服务容器的输出。

docker-compose logs [options] [SERVICE...]

options:

-no-color:关闭彩色输出;

-f,-follow:持续跟踪输出日志消息;

-t,-timestamps:显示时间戳信息;

-tail="all":仅显示指定行数的最新日志消息。

6.3.3.11 pause命令和unpause命令

暂停一个服务容器和恢复暂停。

pause [SERVICE...]   / unpause [SERVICE]

 

以上是先肜pause命令暂停hello1这个服务,然后再用unpause这个命令来恢复

6.3.3.12 port命令

打印某个容器端口所映射的公共端口。

port [options] SERVICE PRIVATE_PORT

options:

--protocol=proto:指定端口协议,tcp(默认值)或者udp

--index=index:如果同一服务存在多个容器,指定命令对象容器的序号(默认为1)。

 

这里我们可以看到,服务容器的80端口,是映射到宿主机8080端口。

6.3.3.13 ps命令

列出项目中目前的所有容器。

docker-compose ps [options] [SERVICE...]

options:

-q:只打印容器的ID信息。

6.3.3.14 pull命令

compose文件中定义的服务拉取镜像,但不启动容器。

docker-compose pull [options] [SERVICE...]

options:

--ignore-push-failures:忽略推送镜像过程中的错误;

--parallel:拉取相似的多个镜像;

--quiet:安静模式,拉取的时候不打印进度信息

 

红框中的内容是指我这个hello1服务,需要从centos:latest这个镜像来创建。

如果我主机本地没有这个镜像的话,使用pull命令,可以从镜像仓中自动拉取这个镜像。

 

把我本地的centos这个镜像先删掉。

 

执行docker-compose pull hello1后,发现自动从镜像仓中拉取了centos这个镜像了。

6.3.3.15 push命令

把服务创建的镜像推送到镜像仓。

push [options] [SERVICE...]

options:

--ignore-push-failures:忽略推送镜像过程中的错误;

docker-compose push hello1    #hello1这个服务创建的镜像推送到镜像仓。

6.3.3.16 restart命令

重启服务;

restart [options] [SERVICE...]

options:

-t, --timeout:指定重启前服务停止超时的时间,单位为秒。

 

6.3.3.17 rm命令

删除容器服务。

rm [options] [SERVICE...]

options:

-f, --force:强制删除,包括处于运行状态的容器;

-s, --stop:在删除之前停止容器;

-v:同时删除数据卷;

6.3.3.18 run命令

在一个服务上执行一个one-off命令。

docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] [-l KEY=VALUE...] SERVICE [COMMAND] [ARGS...]

options:

-d:在后台运行

--name:指定容器的名称

--entrypoint:覆盖镜像中指定的入口命令;

-e KEY=VAL:设置一个环境变量,可多次使用;

-l,--label:增加或覆盖一个标签;

-u,--user:指定用户名或UID来运行容器;

--no-deps:不启动相关联的服务;

--rm:运行以后删除容器,后台运行模式下将被忽略;

-p,--publish:映射容器到端口到宿主机;

--service-ports:配置服务端口并映射到宿主机;

-v,--volume:挂载一个数据卷;

-T:不分配伪TTL

-w,--workdir:指定容器内的工作目录。

docker-compose run -d hello1 ping baidu.com

hello1这个服务上执行”ping baidu.com”这个命令。

 

它会自动创建一个名为test_hello1_run_1的容器,并执行ping baidu.com命令。

6.3.3.19 start命令

启动已在存在的服务容器。

docker-compose start [SERVICE...]

6.3.3.20 stop命令

停止处于运行状态的服务容器,但是不删除它;

docker-compose  stop [options] [SERVICE...]

options:

-t,--timeout:指定一个容器停止超时,默认为10S

6.3.3.21 top命令

显示服务栈中的进程信息。

docker-compose top [SERVICE...]

6.3.3.22 version命令

打印docker-compose版本信息

docker-compose version [--short]

--short:只显示compose版本号

6.3.4 compose环境变量

环境变量可以用来配置compose的行为,详见下表:

变量

功能

COMPOSE_PROJECT_NAME

设置项目名称,默认是当前的工作目录(docker-compose.yml文件所在的目录)的名字。

COMPOSE_FILE

设置要使用的docker-compose.yml的路径。如果不指定,默认会先查找当前工作目录下是否存在docker-compose.yml文件,如果找不到,则会继续查找上层目录。

COMPOSE_API_VERSION

某些情况下,compose发出的docker请求,其版本可能在服务端并不支持,可以通过指定API版本来临时解决这个问题。

DOCKER_HOST

设置dockere服务端的监听地址。默认使用unix:///var/run/docker.sock

DOCKER_TLS_VERIFY

如果该环境变量不为空,则与docker服务端的所有交互都通过TLS协议进行加密。

DOCKER_CERT_PATH

配置TLS通信所需要的验证文件(包括ca.pem、cert.pem和key.pem)的路径,默认是~/.docker

COMPOSE_HTTP_TIMEOUT

compose向docker服务端发送请求时的超时,默认值为60s

COMPOSE_TLS_VERSION

指定与docker服务进行交互的TLS版本,支持版本为TLSV1(默认值)、TLSV1_1、TLSV1_2

COMPOSE_PATH_SEPARATOR

指定COMPOSE_FILE环境变量中的路径间隔符

COMPOSE_IGNORE_ORPHANS

是否忽略孤儿容器

COMPOSE_PARALLEL_LIMIT

设置compose可以执行进程的并发数

COMPOSE_INTERACTIVE_NO_CLI

尝试不使用docker命令来执行run和exec指令

使用这些环境参数,需要在工作目录下创建一个名为.env的文件(注意:必须是这个文件名)

 

这里将COMPOSE_PROJECT_NAME这个环境变量的值,设为myfirstproject

 

可以看到,项目名称已经变成myfirstproject了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暮毅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值