zl程序教程

您现在的位置是:首页 >  工具

当前栏目

如何设置service中容器的运行环境?环境变量、用户、工作目录?

容器 如何 环境 设置 用户 运行 工作 目录
2023-09-11 14:14:16 时间

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点,在具体的实际场景中,根据不同的需要进行设置就可以了

 

本次文章的内容就到这里······