Docker|Docker 笔记 - 让 docker-compose 命令在任意路径下都能使用

维护 docker harbor 仓库的命令 docker-compose,有个奇(很)怪(low)的默认设定,就是必须在 docker-compose.yml(或者 docker-compose.yml、docker-compose.yaml、compose.yml、compose.yaml 四个文件中任意一个文件)所在的目录中执行才有效。
在任意路径下执行 docker-compose 命令,得到的结果可能是:

[root@k8s-master ~]# docker-compose ps ERROR: Can't find a suitable configuration file in this directory or any parent. Are you in the right directory?Supported filenames: docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml

假如 docker-compose.yml 的位置是:
/data/soft/harbor/docker-compose.yml

此时,进入这个 yml 文件所在的目录,然后再执行 docker-compose 命令就会正常:
[root@k8s-master ~]# cd /data/soft/harbor [root@k8s-master harbor]# docker-compose ps NameCommandStatePorts ------------------------------------------------------------------------------------------------------ harbor-core/harbor/harbor_coreUp (health: starting) harbor-db/docker-entrypoint.shExit 255 harbor-jobservice/harbor/harbor_jobservice...Exit 255 harbor-log/bin/sh -c /usr/local/bin/ ...Up (healthy)127.0.0.1:1514->10514/tcp harbor-portalnginx -g daemon off; Exit 255 nginxnginx -g daemon off; Restarting redisredis-server /etc/redis.confExit 255 registry/home/harbor/entrypoint.shUp (healthy)5000/tcp registryctl/home/harbor/start.shExit 255

关于这个默认的设定,目前没找到一个明确的说明或相关资料。猜测可能是两方面的原因,一是这个东西很容易优化,二是 docker harbor 使用人的不多,官方没有动力去优化它。
不管原因是什么,日常使用的时候不可能为了执行一个命令频繁在各个目录间跳来跳去。为了方便维护、提高效率,需要让 docker-compose 命令在任意路径下均可执行。
本文提供一种最简单的办法:通过设置 alias 别名(环境变量)来实现 docker-compose 命令在任意路径下可执行。
Linux 中 alias 命令用来设置指令的别名,通常用于对一些较长的命令进行简化。它的语法格式为:
alias [别名]='原命令 -选项/参数'

例如:
alias ll='ls -lt'

那么让 docker-compose 命令在任意路径下都能使用的设置方法如下:
vim ~/.bashrc,加入一行:
alias docker-compose='cd /data/soft/harbor; docker-compose'

保存退出,执行:
source ~/.bashrc

查看已经设置的别名列表,此时能看到 docker-compose 已经设置:
[root@k8s-master harbor]# alias -p alias cp='cp -i' alias docker-compose='cd /data/soft/harbor; docker-compose' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

验证:在任意路径下执行 docker-compose 命令发现已经可以正常执行了:
[root@k8s-master harbor]# cd /data/ [root@k8s-master data]# docker-compose ps NameCommandStatePorts ------------------------------------------------------------------------------------------------------ harbor-core/harbor/harbor_coreUp (health: starting) harbor-db/docker-entrypoint.shExit 255 harbor-jobservice/harbor/harbor_jobservice...Exit 255 harbor-log/bin/sh -c /usr/local/bin/ ...Up (healthy)127.0.0.1:1514->10514/tcp harbor-portalnginx -g daemon off; Exit 255 nginxnginx -g daemon off; Restarting redisredis-server /etc/redis.confExit 255 registry/home/harbor/entrypoint.shUp (healthy)5000/tcp registryctl/home/harbor/start.shExit 255

【Docker|Docker 笔记 - 让 docker-compose 命令在任意路径下都能使用】其他说明:
如果执行 source ~/.bashrc 后还不行,有可能是因为 ~/.bash_profile 文件少了 ~/.bashrc 的配置,将如下配置加入到 ~/.bash_profile 文件中并执行 source ~/.bash_profile 即可(通常不需要添加,默认存在。但使用时间比较久的 Linux 系统有可能会因为管理员经常改环境变量导致环境变量异常或者配置丢失):
# Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi

    推荐阅读