重击:sudo:找不到命令

时间:2018-08-07 19:59:07

标签: bash docker permissions sudo

[这里是docekr新手]我有一个正在运行的容器,我希望执行数据库备份。显然,来自docker的简单命令如:sudo mkdir new_folder导致:bash: sudo: command not found

我尝试了什么(在直觉上),我使用docker exec -i -t 434a38fedd69/bin/bash和RUN访问了一个正在运行的容器

apt-get update 
apt-get install sudo

退出到docker并尝试执行sudo mkdir new_folder时,我收到了相同的消息bash: sudo: command not found

Baresp@adhg MINGW64 /c/Program Files/Docker Toolbox/postgre
$ mkdir new_folder
mkdir: cannot create directory ‘new_folder’: Permission denied

Baresp@adhg MINGW64 /c/Program Files/Docker Toolbox/postgre
$ sudo mkdir new_folder
bash: sudo: command not found

顺便说一句,我不确定这是否相关,但是我使用的docker-compose文件是:

version: '2'

services:
postgres:
image: postgres
environment:
  POSTGRES_USER: postgres
  POSTGRES_PASSWORD: changeme
  PGDATA: /data/postgres
volumes:
   - /data/postgres:/data/postgres
ports:
  - "5432:5432"
networks:
  - postgres
restart: unless-stopped
container_name: xx_postgres

pgadmin:
links:
  - postgres:postgres
image: fenglc/pgadmin4
volumes:
   - /data/pgadmin:/root/.pgadmin
ports:
  - "5050:5050"
networks:
  - postgres
restart: unless-stopped
container_name: xx_pgadmin


networks:
postgres:
driver: bridge

2 个答案:

答案 0 :(得分:0)

首先,您在docker exec中所做的任何操作都不会在该特定运行容器(图像的副本)之外持久存在,因此,如果您希望以后从该图像运行的容器包括sudo,则这些{ {1}}命令需要进入构建映像的Dockerfile中。由于您使用的是apt-get,因此您需要先创建一个Dockerfile并在YAML中指定其位置。

第二,您什么意思是“退出docker”?在容器内进行的任何操作都不会对Docker本身所运行的系统产生任何影响,但是看起来您正在Docker容器内运行软件安装命令,然后期望这会导致新安装的软件被在运行Docker的Windows系统上的容器外部可用。

答案 1 :(得分:0)

要在容器中备份postgres数据库,首先必须输入容器(类似于您的操作):

docker exec -it postgres bash

(用您从docker-compose ps获得的真实容器名称进行subgres postgres) 现在,您以根用户身份进入容器。这意味着,您不需要sudo进行任何操作。接下来创建您的备份文件夹:

mkdir /tmp/backup

现在,从一个快速的Google运行备份命令,我发现了以下内容(您可能知道的更多):

pg_dumpall > /tmp/backup/filename

然后通过键入exit退出容器内的外壳。从主机系统运行以下命令,将备份文件复制到容器外:

docker cp postgres:/tmp/backup/filename .

(postgres再次是您的容器名称)