试图让docker运行,不断给我一个错误

时间:2017-08-07 20:34:27

标签: bash apache docker

我正在尝试使用docker-compose up运行docker,但我仍然遇到此错误。

Removing storemagento_nginx_1
storemagento_redis_1 is up-to-date
storemagento_db_1 is up-to-date
storemagento_fpm_1 is up-to-date
Recreating f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_storemagento_nginx_1 ... 
Recreating f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_storemagento_nginx_1 ... error

ERROR: for f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_f751fff8304c_storemagento_nginx_1  Cannot start service nginx: driver failed programming external connectivity on endpoint storemagento_nginx_1 (7b1963dbb7e3b5ea97394dce65168d4a591301fb834c489aad52a9c2ea4e6eb7): Error starting userland proxy: Bind for 0.0.0.0:80: unexpected error (Failure EADDRINUSE)

ERROR: for nginx  Cannot start service nginx: driver failed programming external connectivity on endpoint storemagento_nginx_1 (7b1963dbb7e3b5ea97394dce65168d4a591301fb834c489aad52a9c2ea4e6eb7): Error starting userland proxy: Bind for 0.0.0.0:80: unexpected error (Failure EADDRINUSE)
ERROR: Encountered errors while bringing up the project.

这曾经很好用,但后来我通过brew安装了apache的更新版本,现在每次来回切换都会发生这种情况。我曾经能够尝试杀死所有的apache进程或重新启动,这似乎工作。但是现在我无法让端口80释放。如果我杀死在端口80上运行的所有进程,apache会消失一分钟,但之后再返回。

所以当我跑

sudo lsof -i :80 | grep LISTEN
httpd   27987 root    4u  IPv6 0xcfcc888f0ccae989      0t0  TCP *:http (LISTEN)
httpd   27992 _www    4u  IPv6 0xcfcc888f0ccae989      0t0  TCP *:http (LISTEN)

这些过程继续回归。我试图创建一个别名,我可以使用它来正确杀死进程,如下所示。但我无法在终端工作。

alias stopall-port80="sudo kill -9 $(sudo lsof -i :80 | grep LISTEN | egrep -v 'PID' | awk '{print $2}' | sort -n | uniq)"

如果我只采用sudo lsof -i :80 | grep LISTEN | egrep -v 'PID' | awk '{print $2}' | sort -n | uniq部分并将其放入终端,它会按预期产生正确的PID。但是,当我尝试运行别名stopall-port80时,我得到bash: 27057: command not found

更新

这是有效的,而不是使用别名

stopall_port80() {
    sudo kill -9 $(sudo lsof -i :80 | grep LISTEN | egrep -v 'PID' | awk '{print $2}' | sort -n | uniq);
}

1 个答案:

答案 0 :(得分:1)

问题1:不需要的Apache重新启动

如果端口“释放一分钟”然后再次使用,则应告知进程监控系统启动冲突进程以停止运行该进程。对于MacOS上的Apache httpd,它看起来像:

sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist

问题2:令人惊讶的别名扩展

您的原始代码是 - 由于使用了双引号 - 在您的别名定义时构建了httpd进程列表,而不是在您的别名<< EM>执行。您可以通过更改引用类型来解决这个问题,但更好的答案是使用函数:

stopall_port80() { sudo kill $(...); }

...会在运行该功能时对$(...)进行评估,而不是在.bashrc中设置时进行评估。

问题3:使用MacOS上的端口检测PID

sudo lsof -n -iTCP:80 | awk '/LISTEN/ { print $2 }'