在尝试连接到AWS ECS EC2实例中的容器时,在$ PATH中找不到可执行文件

我很难搞清楚如何通过ssh连接到我的EC2实例中的Docker容器。 基本上,我可以进入服务器好,并使用docker ps列出我的容器。

但是,我无法在该容器中获得一个shell来运行我需要运行的一些shell脚本。

本地,我只是使用…

 docker attach [cid] # or 'docker exec -it [cid] bash' to open new shell 

…但是,有明显的问题与运行docker attachdocker exec -it [cid] bash我越来越…

 rpc error: code = 2 desc = "oci runtime error: exec failed: exec: \"bash\": executable file not found in $PATH" 

为了提供一些细节,我相信我已经正确地设置了ECS。 从适用的社区AMI amzn-ami-2016.03.e-amazon-ecs-optimized我已完成以下设置:

  • 一个适用的ecsInstanceRole和ecsServiceRole
  • 正在运行的EC2实例。
  • 指向该实例的负载均衡器。
  • ECS中的标记存储库。
  • 指向ECS存储库的ECS任务定义。
  • 一个ECS集群,分配了一个实例插槽,并通过(我相信)启动脚本成功地与EC2相关联。 这个集群还有一个与我提到的负载平衡器相关的服务以及相关的任务定义。

我不相信这是我的问题所在(但也许)

也许这是我的Dockerfile?

 FROM centos:centos6 RUN yum -y update; yum clean all; \ yum groupinstall -y "Web Server" "MySQL Database" "PHP Support" "Development Tools"; \ service httpd start; \ chkconfig httpd on; RUN yum install -y openssh openssh-clients git php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-mssql php-snmp php-soap php-tidy curl curl-devel php-pecl-apc mysql; # PHP RUN sed -i '\%^<Directory "/var/www/html">%,\%^</Directory>% s/AllowOverride None/AllowOverride All/' /etc/httpd/conf/httpd.conf; # MONGO ADD docker/mongo/setup.sh /root/mongo.setup.sh RUN chmod +x /root/mongo.setup.sh; RUN yum install -y cyrus-sasl2 cyrus-sasl-devel php-devel; \ echo "extension=mongo.so" >> /etc/php.ini; # GIT CONFIG AND AUTH ADD docker/ssh/ /root/.ssh/ RUN chmod 600 /root/.ssh/*; \ touch /root/.ssh/known_hosts; \ ssh-keyscan github.com >> /root/.ssh/known_hosts; # EMAIL SES CONFIG AND AUTH ADD docker/postfix/sasl_passwd /etc/postfix/sasl_passwd ADD docker/postfix/main.appended.txt /etc/postfix/main.appended.txt ADD docker/postfix/setup.sh /root/postfix.setup.sh RUN chmod +x /root/postfix.setup.sh; RUN yum install -y stunnel telnet telnet-server mailx postfix cyrus-sasl cyrus-sasl-plain cyrus-sasl-md5 cyrus-imapd postfix cyrus-sasl cyrus-sasl-plain cyrus-sasl-md5 cyrus-imapd openssl openssl-devel; \ sed -i 's/-o smtp_fallback_relay=/#-o smtp_fallback_relay=/g' /etc/postfix/master.cf; \ cat /etc/postfix/main.appended.txt >> /etc/postfix/main.cf; \ chmod 600 /etc/postfix/main.appended.txt; \ postmap hash:/etc/postfix/sasl_passwd; # ADD YII LIBRARY ADD docker/yii.tar.gz /var/www # CLONE APPLICATION RUN cd /var/www; \ mkdir repo; \ git clone git@github.com:myrepos.git html; \ cd html; \ git checkout production; # NODE INSTALLATION RUN yum install -y gcc gcc-c++ wget tar; \ cd /root/; \ wget http://nodejs.org/dist/v0.10.30/node-v0.10.30.tar.gz; \ tar xzvf node-v*; \ cd node-v*; \ ./configure; \ make; \ make install; # CREATE SOME DIRECTORIES FOR THE APPLICATION RUN mkdir /var/www/.tmp; \ mkdir /var/www/.tmp/data; \ mkdir /var/www/coach_tests; \ mkdir /var/www/html/protected/data/sessions; \ mkdir /var/www/html/staging/protected/data/sessions; \ mkdir /var/www/html/development/protected/data/sessions; \ mkdir /var/www/html/protected/runtime; \ mkdir /var/www/html/staging/protected/runtime; \ mkdir /var/www/html/development/protected/runtime; \ mkdir /var/www/html/assets; \ mkdir /var/www/html/images/cache; # GRUNT SETUP ADD docker/www/Gruntfile.coffee /var/www/Gruntfile.coffee ADD docker/www/package.json /var/www/package.json RUN npm install -g grunt-cli; \ cd /var/www; \ npm install; # S3 MOUNT CONFIG AND AUTH ADD docker/s3/setup.sh /root/s3.setup.sh RUN chmod +x /root/s3.setup.sh; RUN yum install -y glib2-devel fuse-devel libevent-devel libxml2-devel; \ cd /root/; \ wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz; \ tar -xzf libevent-2.0.21-stable.tar.gz; \ cd libevent-2.0.21-stable; \ ./configure && make; \ make install; \ echo "/usr/local/lib/" > /etc/ld.so.conf.d/riofs.conf; \ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig; \ ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5; \ cd ../; \ git clone https://github.com/skoobe/riofs.git; \ cd riofs; \ ./autogen.sh; \ ./configure; \ make; \ make install; \ mkdir -p /var/www/html/images/user; \ mkdir -p /var/www/html/images/store; \ mkdir -p /var/www/html/images/sponsor; \ mkdir -p /var/www/html/images/supporter; \ mkdir -p /var/www/html/images/media; # USEFUL TOOLS ADD docker/startup.sh /root/startup.sh RUN chmod +x /root/startup.sh; RUN yum install -y nano; # GRUNT INITIATE RUN cd /var/www; \ grunt init; 

哦,有时候,当我刚刚接触一些东西时,我花了很多时间去寻找那些我看到的更为明显的问题的小细节。 在这种特殊情况下,我忽略了docker ps列表中的“IMAGE”列,假设它一定是我的形象,而没有注意除容器ID之外的其他任何东西。 唯一的运行容器是amazon/amazon-ecs-agent:latest难怪我有问题得到一个壳里面。

亚龙的评论让我想起了这件事,因为提到docker run命令触发了一个啊哈的时刻。 我猜,我认为它是在任务定义之后运行的,因此我认为唯一的运行中的容器必须被挖掘:P

运行docker run -it -p 88:80 --privileged --cap-add MKNOD --cap-add SYS_ADMIN -d 1234546677788.dkr.ecr.us-west-2.amazonaws.com/my-ecs-repos /bin/bashdocker run -it -p 88:80 --privileged --cap-add MKNOD --cap-add SYS_ADMIN -d 1234546677788.dkr.ecr.us-west-2.amazonaws.com/my-ecs-repos /bin/bash ECS EC2实例,我可以访问网站,并得到一个容器内的壳:D

检查图像/容器中安装了哪个shell。

 sudo docker exec -it [cid] echo $SHELL 

如果上面的命令返回/ bin / bash ,那么docker exec -it [cid] bash应该可以工作。

否则,你必须使用适当的shell。