繁体   English   中英

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

[英]executable file not found in $PATH when trying to connect to a container in an AWS ECS EC2 instance

我很难弄清楚如何通过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所以难怪我有问题在其中获得一个shell。

Yaron的评论让我想起了这一点,因为有人提到了一个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/bash后运行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/bash在ECS EC2实例上的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/bash ,我能够访问该网站并获得容器内的shell:D

检查映像/容器中安装的shell。

sudo docker exec -it [cid] echo $SHELL

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM