我是docker和linux的新手。
我使用的是Windows 10,并有一个github示例,使用Centos和nginx创建了一个容器。
我需要使用root用户来更改nginx.config。
在Kitematic中,我单击Exec以在容器中获得bash外壳,然后尝试了sudo su –作为打击:
sh-4.2$ sudo su –
sh: sudo: command not found
因此,我尝试通过以下命令安装sudo:
sh-4.2$ yum install sudo -y
Loaded plugins: fastestmirror, ovl
ovl: Error while doing RPMdb copy-up:
[Errno 13] Permission denied: '/var/lib/rpm/Installtid'
You need to be root to perform this command.
然后我运行su-,但是我不知道密码!如何设置密码?
sh-4.2$ su -
Password:
然后,在Windows的powershell中,我也尝试过:
PS C:\Containers\nginx-container> docker exec -u 0 -it 9e8f5e7d5013 bash
但是它表明脚本正在运行,什么也没发生,一个小时后我通过Ctrl + C取消了它。
一些其他信息:
这是我创建容器的方式:
PS C:\Containers\nginx-container> s2i build https://github.com/sclorg/nginx-container.git --context->dir=examples/1.12/test-app/ centos/nginx-112-centos7 nginx-sample-app
从容器中的bash shell开始。我可以获得以下操作系统信息:
sh-4.2$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
如果能帮助我解决这些问题,我将不胜感激。
谢谢!
答案 0 :(得分:3)
您的方法通常是错误的。您应该在容器外部准备文件,然后让Docker自己进行更改。
有几种方法可以实现此目的。
您可以在启动过程中挂载文件:
docker run -v /your/host/path/to/config.cfg:/etc/nginx/config.cfg ...
您可以在构建容器期间(在Dockerfile内部)将文件复制到容器中:
FROM base-name
COPY config.cfg /etc/nginx/
您可以将补丁应用到配置脚本(再次是Dockerfile):
FROM base-name
ADD config.cfg.diff /etc/nginx/
RUN ["patch", "-N", "/etc/nginx/config.cfg", "--input=/etc/nginx/config.cfg.diff"]
对于每种方法,StackOverflow上都有很多示例。
答案 1 :(得分:2)
您应该阅读Docker的official tutorial on building and running custom images。我很少在容器中的交互式shell中工作;相反,我设置了一个Dockerfile
来构建可以自主运行的映像,并像其他任何软件一样迭代构建和运行该映像。在这种情况下,su
和sudo
并不是很有用,因为容器很少具有控制终端或人工操作员来输入密码(因此,对于任何容器,通常都没有有效的密码)用户)。
相反,如果我想以非root用户身份在容器中工作,我的Dockerfile需要设置该用户:
FROM ubuntu:18.04
WORKDIR /app
COPY ...
RUN useradd -r -d /app myapp
USER myapp
CMD ["/app/myapp"]
我看到的一个例外是,如果您有一个容器,无论出于何种原因,该容器都需要以root用户身份进行初始工作,然后放弃特权才能进行其实际工作。 (特别是official Consul image这样做。)它使用专用的轻量级工具,例如gosu或su-exec。一个典型的Dockerfile设置可能看起来像
# Dockerfile
FROM alpine:3.8
RUN addgroup myapp \
&& adduser -S -G myapp myapp
RUN apk add su-exec
WORKDIR /app
COPY . ./
ENTRYPOINT ["/app/docker-entrypoint.sh"]
CMD ["/app/myapp"]
#!/bin/sh
# docker-entrypoint.sh
# Initially launches as root
/app/do-initial-setup
# Switches to non-root user to run real app
su-exec myapp:myapp "$@"
docker run
和docker exec
都使用一个-u
参数来指示用户以其身份运行。如果您以错误的用户身份启动了容器,请删除它,然后使用正确的docker run -u
选项重新创建它。 (不过,这不是我发现自己想要经常改变的人。)
答案 2 :(得分:1)
我在本地启动了容器,结果发现您不需要sudo
即可使用默认情况下在debian映像上附带的su
进行操作
docker run -dit centos bash
docker exec -it 9e82ff936d28 sh
su
您还可以尝试执行以下默认操作,以使您默认为root用户:
docker run -dit centos bash
docker exec -it 9e82ff936d28 bash
您永远都可以在容器外部创建Nginx配置,并使用docker container copy {file_path} {container_id}:{path_inside_container}
答案 3 :(得分:0)
谢谢大家。
我认为最好是用Centos设置一个virtualbox并与nginx一起玩。 然后,当我准备好并拥有正确的nginx.config时,可以使用Dockerfile复制我的配置文件。
VM太慢了,我希望可以在容器中的交互式shell中学习和玩游戏而不是使用VM。你有什么比virtualbox更好的主意吗?
我尝试了
var multer = require('multer')
var MulterAzureStorage = require('multer-azure-storage')
var upload = multer({
storage: new MulterAzureStorage({azureStorageConnectionString:
'DefaultEndpointsProtocol=https;AccountName=mystorageaccount;
AccountKey=mykey;EndpointSuffix=core.windows.net',
containerName: 'photos',
containerSecurity: 'blob',
fileName : ?//how to use this options properties
})
} )
它什么也没做,而是保持以下状态: here
相同的命令适用于debian映像,但不适用于centos。