2016-07-17 48 views
3

我很难弄清楚如何通过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 - 亚马逊ECS优化我已经完成了以下设置:

  • 的适用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 [email protected]: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; 
+0

您究竟如何连接到容器?你使用Docker的目的是什么?那里有很多东西。 – ldg

+1

我们应该将ECS特定问题与来自特定容器设置的问题分开。首先,您能否在ECS实例中成功运行此命令 - “docker run -it centos:centos6 bash”? (在我们的ECS实例上为我工作) –

回答

0

检查在图像/容器中安装了哪个外壳。

sudo docker exec -it [cid] echo $SHELL 

如果上述命令返回/斌/庆典,然后搬运工EXEC -it [CID]的bash应该工作。

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

1

哦,人......有时当我刚接触一些东西时,我花了那么多时间去寻找那些细微的细节,这些细节让我对更明显的问题产生了兴趣。在这种特殊情况下,我忽略了我的docker ps列表中的“IMAGE”列,前提是它必须是我的图片,而不会注意除容器ID之外的其他任何内容。唯一正在运行的容器是amazon/amazon-ecs-agent:latest,所以难怪我有问题在里面找到一个shell。

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

在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

相关问题