如何设置service中容器的运行环境?环境变量、用户、工作目录?
0、导语
今天的文章呢,主要为你解决3个问题:
- 1、如何为service中运行的容器设置环境变量?
- 2、如何指定容器以什么用户执行?
- 3、容器的工作目录(workdir)?
下面咱们一个一个的来看。
1、如何设置容器的环境变量?
非常的简单,在创建service的时候,通过--env指定变量和变量值就可以了
来看个例子:
docker service create \ --with-registry-auth \ --name envtest \ --env VAR=value \ --env VAR2=val2 \ 172.20.58.152/middleware/nginx:1.21.4
[root@nccztsjb-node-01 ~]# docker service create \ > --with-registry-auth \ > --name envtest \ > --env VAR=value \ > --env VAR2=val2 \ > 172.20.58.152/middleware/nginx:1.21.4 6z66wzipszszt7bpgzt6spm7g overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged [root@nccztsjb-node-01 ~]#
查看下容器中环境变量:
[root@nccztsjb-node-02 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17316b6bcc90 172.20.58.152/middleware/nginx:1.21.4 "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp envtest.1.npvjbqcr8h4x7qn239cbppm2u [root@nccztsjb-node-02 ~]# docker exec -it 17316b6bcc90 env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=17316b6bcc90 TERM=xterm VAR=value VAR2=val2 NGINX_VERSION=1.21.4 NJS_VERSION=0.7.0 PKG_RELEASE=1~bullseye HOME=/root [root@nccztsjb-node-02 ~]#
可以看到环境变量已经正确的设置了,这个例子里面设置了2个环境变量。
2、如何指定容器以哪个用户执行?
通过在创建service的时候,指定--user参数,指定要运行的用户名
比如,下面的例子
查看当前容器用哪个用户在运行
可以看到,目前在用root在运行
[root@nccztsjb-node-02 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 38b124aa0ff8 172.20.58.152/baseimage/alpine:latest "ping www.baidu.com" 20 seconds ago Up 19 seconds envtest.1.3liiaumkie4i6pfpwlf8ukmp2 [root@nccztsjb-node-02 ~]# docker exec -it 38b124aa0ff8 env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=38b124aa0ff8 TERM=xterm HOME=/root [root@nccztsjb-node-02 ~]# docker exec -it 38b124aa0ff8 cat /etc/passwd root:x:0:0:root:/root:/bin/ash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/mail:/sbin/nologin news:x:9:13:news:/usr/lib/news:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin man:x:13:15:man:/usr/man:/sbin/nologin postmaster:x:14:12:postmaster:/var/mail:/sbin/nologin cron:x:16:16:cron:/var/spool/cron:/sbin/nologin ftp:x:21:21::/var/lib/ftp:/sbin/nologin sshd:x:22:22:sshd:/dev/null:/sbin/nologin at:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin squid:x:31:31:Squid:/var/cache/squid:/sbin/nologin xfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin games:x:35:35:games:/usr/games:/sbin/nologin cyrus:x:85:12::/usr/cyrus:/sbin/nologin vpopmail:x:89:89::/var/vpopmail:/sbin/nologin ntp:x:123:123:NTP:/var/empty:/sbin/nologin smmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin guest:x:405:100:guest:/dev/null:/sbin/nologin nobody:x:65534:65534:nobody:/:/sbin/nologin [root@nccztsjb-node-02 ~]# docker exec -it 38b124aa0ff8 whoami root
将这个容器修改为用ftp用户在运行,可以像下面这么做
docker service create \ --with-registry-auth \ --name envtest \ --user ftp \ 172.20.58.152/baseimage/alpine:latest \ ping www.baidu.com
通过--user创建一个以ftp用户运行的容器,运行之后,看下现在到底是用哪个用户运行的
[root@nccztsjb-node-02 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 83a8ff6ac55e 172.20.58.152/baseimage/alpine:latest "ping www.baidu.com" 13 seconds ago Up 12 seconds envtest.1.je536vpsce84yzwo63nr3jwrl [root@nccztsjb-node-02 ~]# docker exec -it 83a8ff6ac55e whoami ftp
看到了吧,现在容器是以ftp用户在运行的。
不过,这里边有一个非常非常非常关键的点,要十分注意。
就是注意容器的运行命令和用户权限的匹配。
比如说:nginx服务默认用root启动,修改为nginx之后,会因为权限而无法启动,所以,要关注启动的entrypoint和CMD,否则,容器会出现启动失败的情况
接下来再看一个
3、如何指定容器的工作目录
就是刚一登录到容器,用户所在的目录
使用:--workdir参数来指定
来看个例子:
[root@nccztsjb-node-02 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 53c81ccff8b0 172.20.58.152/baseimage/alpine:latest "ping www.baidu.com" 8 seconds ago Up 6 seconds envtest.1.iy3oiyw63n98tpojqjvq2v8kx [root@nccztsjb-node-02 ~]# docker exec -it 53c81ccff8b0 pwd /
这个容器的workdir在 / 根目录
现在要将它修改为/tmp目录,看下面
docker service create \ --with-registry-auth \ --name envtest \ --user ftp \ --workdir /tmp \ 172.20.58.152/baseimage/alpine:latest \ ping www.baidu.com
部署之后,再看下,是否真的调整过来了
[root@nccztsjb-node-02 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 03568f098c2b 172.20.58.152/baseimage/alpine:latest "ping www.baidu.com" 31 seconds ago Up 30 seconds envtest.1.6wckr13u09wquwec0zxf20elk [root@nccztsjb-node-02 ~]# [root@nccztsjb-node-02 ~]# docker exec -it 03568f098c2b pwd /tmp [root@nccztsjb-node-02 ~]#
完美,已经成功修改了workdir为/tmp
来总结下······
4、总结
- 设置环境变量 --env
- 设置运行用户 --user
- 设置工作目录 --workdir
OK,就这3点,在具体的实际场景中,根据不同的需要进行设置就可以了
本次文章的内容就到这里······