我很难弄清楚如何通过 ssh 连接到我的 EC2 实例中的 Docker 容器。 基本上,我可以进入服务器并使用docker ps
列出我的容器。
但是,我无法在该容器内获得 shell 来运行我需要运行的一些 shell 脚本。
在本地,我只是使用...
docker attach [cid] # or 'docker exec -it [cid] bash' to open new shell
。但是运行docker attach
和我得到docker exec -it [cid] bash
存在明显的问题......
rpc error: code = 2 desc = "oci runtime error: exec failed: exec: "bash": executable file not found in $PATH"
为了提供一些细节,我相信我已经正确设置了 ECS。 从名为 amzn-ami-2016.03.e-amazon-ecs 优化的适用社区 AMI 中,我已完成以下设置:
- 适用的 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
在 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 应该可以工作。
否则,您必须使用适当的外壳。