bash - Docker Run执行shell命令无法访问PATH环境变量

标签 bash docker path sh docker-run

我正在使用an official image from Microsoft其中包含用于与 Microsoft SQL Servers 交互的 SQL 工具。如果我以交互方式运行容器,我可以在命令行运行 sqlcmd 而不会出现任何问题,因为它位于 PATH 变量中:

$ docker run --rm -it -v $(pwd):/var/update/ -w /var/update  mcr.microsoft.com/mssql-tools:latest
root@df20bd19b982:/var/update# sqlcmd
Microsoft (R) SQL Server Command Line Tool
Version 13.1.0007.0 Linux
Copyright (c) 2012 Microsoft. All rights reserved.

usage: sqlcmd            [-U login id]          [-P password]
  [-S server or Dsn if -D is provided]
  [-H hostname]          [-E trusted connection]
  [-N Encrypt Connection][-C Trust Server Certificate]
  [-d use database name] [-l login timeout]     [-t query timeout]
  [-h headers]           [-s colseparator]      [-w screen width]
  [-a packetsize]        [-e echo input]        [-I Enable Quoted Identifiers]
  [-c cmdend]
  [-q "cmdline query"]   [-Q "cmdline query" and exit]
  [-m errorlevel]        [-V severitylevel]     [-W remove trailing spaces]
  [-u unicode output]    [-r[0|1] msgs to stderr]
  [-i inputfile]         [-o outputfile]
  [-k[1|2] remove[replace] control characters]
  [-y variable length type display width]
  [-Y fixed length type display width]
  [-p[1] print statistics[colon format]]
  [-R use client regional setting]
  [-K application intent]
  [-M multisubnet failover]
  [-b On error batch abort]
  [-D Dsn flag, indicate -S is Dsn]
  [-X[1] disable commands, startup script, environment variables [and exit]]
  [-x disable variable substitution]
  [-? show syntax summary]

root@b33a916d4230:/var/update# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/mssql-tools/bin
root@b33a916d4230:/var/update#

sqlcmd is present in /opt/mssql-tools/bin/ folder which is part of the PATH env. variable.

但是如果我尝试在docker run...bash -c 'sqlcmd'执行sqlcmd命令,它不会找到它。我在同一命令行中回显 PATH 环境变量,发现其路径即 /opt/mssql-tools/bin 已在 PATH 中。

$ docker run --rm -it -v $(pwd):/var/update/ -w /var/update  mcr.microsoft.com/mssql-tools:latest bash -c "sqlcmd"
bash: sqlcmd: command not found

并查看PATH环境。变量,我做了以下操作:

$docker run --rm -it -v $(pwd):/var/update/ -w /var/update  mcr.microsoft.com/mssql-tools:latest bash -c 'echo $PATH'

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

问题 1:如果我们使用 bash -c 'commands',为什么路径变量会不同?
问题2:如果bash -csh -c创建了一个新的shell,如何使用容器的环境变量(尤其是PATH环境变量。

最佳答案

当您以 root 身份运行交互式 shell 时,它会运行 /root/.bashrc 中的命令,其中(在此特定图像中)包括

export PATH="$PATH:/opt/mssql-tools/bin"

更好的 Docker 镜像会在 Dockerfile 本身中包含该设置,从而将其导出到镜像的所有用户。您可以轻松地自己构建这样的图像。

FROM mcr.microsoft.com/mssql-tools:latest
ENV PATH="$PATH:/opt/mssql-tools/bin"

(此外,export 是多余的;该变量已由 shell 导出。)

如果您不想弄乱图像,请尝试

docker run --rm -it -v $(pwd):/var/update/ -w /var/update \
       mcr.microsoft.com/mssql-tools:latest \
       bash -c 'PATH=$PATH:/opt/mssql/bin sqlcmd'

关于bash - Docker Run执行shell命令无法访问PATH环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75005317/

相关文章:

Tomcat 使用项目目录作为相对路径

linux - apt-get 代理 : Permission denied

javascript - 为什么 <script> src 中的路径以单斜杠开头会导致错误?

python - 为什么 os.path.join() 在这种情况下不起作用?

docker - 如何从父主机解析Docker主机名?

django - 使用自定义docker文件组成docker卷

docker - 如何让容器在 Kubernetes 上运行?

linux - 如何使用 'sed' 通过 bash 脚本中另一个文件的输出来修改一个文件?

ruby - Cron 作业不起作用

bash - UNIX 'join' 命令在意外标记 `(' 附近引发语法错误