维护 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
      Name                     Command                       State                     Ports          
------------------------------------------------------------------------------------------------------
harbor-core         /harbor/harbor_core              Up (health: starting)                            
harbor-db           /docker-entrypoint.sh            Exit 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-portal       nginx -g daemon off;             Exit 255                                         
nginx               nginx -g daemon off;             Restarting                                       
redis               redis-server /etc/redis.conf     Exit 255                                         
registry            /home/harbor/entrypoint.sh       Up (healthy)            5000/tcp                 
registryctl         /home/harbor/start.sh            Exit 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
      Name                     Command                       State                     Ports          
------------------------------------------------------------------------------------------------------
harbor-core         /harbor/harbor_core              Up (health: starting)                            
harbor-db           /docker-entrypoint.sh            Exit 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-portal       nginx -g daemon off;             Exit 255                                         
nginx               nginx -g daemon off;             Restarting                                       
redis               redis-server /etc/redis.conf     Exit 255                                         
registry            /home/harbor/entrypoint.sh       Up (healthy)            5000/tcp                 
registryctl         /home/harbor/start.sh            Exit 255

其他说明:
如果执行 source ~/.bashrc 后还不行,有可能是因为 ~/.bash_profile 文件少了 ~/.bashrc 的配置,将如下配置加入到 ~/.bash_profile 文件中并执行 source ~/.bash_profile 即可(通常不需要添加,默认存在。但使用时间比较久的 Linux 系统有可能会因为管理员经常改环境变量导致环境变量异常或者配置丢失):

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

逆熵流
10 声望5 粉丝

终身学习,向上生长~