如何在Docker构建过程中使用环境变量来获取脚本?

托马斯·萨布利克

我正在创建具有类似以下docker项目的类似问题的映像:

Docker文件

FROM alpine:3.9.3

COPY ./env.sh /env.sh
RUN source /env.sh
CMD env

env.sh

TEST=test123

我用

docker build -t sandbox .

并运行它

docker run --rm sandbox

输出是

HOSTNAME=72405c43801b
SHLVL=1
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

我的环境变量丢失。

在实际项目中,我必须为安装IBM DB2客户机的源程序提供一个较长的复杂脚本,该脚本还设置了环境变量。如何在不阅读整个安装过程并ENV在dockerfile中设置所有变量的情况下实现它

编辑:在实际项目中,文件env.sh是在安装过程中创建的,并且无法从容器外部使用。根据在其上执行的系统来设置环境变量。如果我在主机上运行它将在来宾中设置错误的变量。

真实脚本的一部分是

if [ -f ${INST_DIR?}/tools/clpplus.jar ]; then
    AddRemoveString CLASSPATH ${INST_DIR?}/tools/clpplus.jar a
fi

if [ -f ${INST_DIR?}/tools/antlr-3.2.jar ]; then
    AddRemoveString CLASSPATH ${INST_DIR?}/tools/antlr-3.2.jar a
fi

if [ -f ${INST_DIR?}/tools/jline-0.9.93.jar ]; then
    AddRemoveString CLASSPATH ${INST_DIR?}/tools/jline-0.9.93.jar a
fi

if [ -f ${INST_DIR?}/java/db2jcc.jar ]; then
    AddRemoveString CLASSPATH ${INST_DIR?}/java/db2jcc.jar a
fi

if [ -f ${INST_DIR?}/java/db2jcc_license_cisuz.jar ]; then
    AddRemoveString CLASSPATH ${INST_DIR?}/java/db2jcc_license_cisuz.jar a
fi

它检查安装并根据此设置变量。由于在主机上没有安装DB2,因此不会设置变量。

大卫·迷兹

每个DockerfileRUN步骤都运行一个新的容器和一个新的shell。如果尝试在一个外壳中设置环境变量,则以后将看不到该变量。例如,您可以尝试以下Dockerfile:

FROM busybox
ENV FOO=foo1
RUN export FOO=foo2
RUN export BAR=bar
CMD echo FOO is $FOO, BAR is $BAR
# Prints "FOO is foo1, BAR is "

有三个很好的解决方案。从最容易/最好到最难/最复杂:

  1. 完全避免使用环境变量。将软件安装到“系统”位置,例如/usr; 无论如何,它将被隔离在Docker映像中。(不要使用其他隔离工具(例如Python虚拟环境)或版本管理器(例如nvmrvm;),只需安装所需的特定工具即可。)

  2. 使用ENV起作用:

    FROM busybox
    ENV FOO=foo2
    ENV BAR=bar
    CMD echo FOO is $FOO, BAR is $BAR
    # Prints "FOO is foo2, BAR is bar"
    
  3. 使用入口点脚本。通常看起来像:

    #!/bin/sh
    # Read in the file of environment settings
    . /opt/wherever/env
    # Then run the CMD
    exec "$@"
    

    COPY将此脚本放入您的Dockerfile中。使之成为ENTRYPOINT; 使它CMD成为您实际运行的东西。

    FROM busybox
    WORKDIR /app
    COPY entrypoint.sh .
    COPY more_stuff .
    ENTRYPOINT ["/app/entrypoint.sh"]
    CMD ["/app/more_stuff/my_app"]
    

    如果你关心这样的事情,环境变量,你通过这种方式设置将不可见docker inspectdocker exec调试环境; 但如果您docker run -it ... sh将它们可见。这是一个有用且足够重要的模式,CMD除非我专门尝试进行此类初次设置,否则我几乎总是在Dockerfile中使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Docker如何在构建过程中在Dockerfile中使用env_file变量

来自分类Dev

如何在cli构建中使用环境变量

来自分类Dev

如何在Robot框架脚本中使用环境变量

来自分类Dev

如何在Passenger-docker容器的启动脚本中使用环境变量

来自分类Dev

如何在docker run命令中使用环境变量?

来自分类Dev

如何在ENTRYPOINT数组中使用Docker环境变量?

来自分类Dev

如何在Docker Compose中使用环境变量

来自分类Dev

如何在Docker ENTRYPOINT中使用撰写环境变量

来自分类Dev

如何在docker args中使用环境变量

来自分类Dev

如何在shell脚本中使环境变量“导出”?

来自分类Dev

如何在npm脚本中获取环境变量?

来自分类Dev

如何在Fish中使用键盘快捷键来扩展环境变量?

来自分类Dev

在clion中使用远程模式时,如何从远程主机上的脚本中获取环境变量?

来自分类Dev

构建Dockerfile时如何使用docker机器的环境变量

来自分类Dev

如何在Django启动过程中检查环境变量

来自分类Dev

如何在python的同一shell中使用脚本导出环境变量?

来自分类Dev

如何在 jq 脚本文件的命令中使用环境变量?

来自分类Dev

使用 envdir 设置运行过程中的环境变量

来自分类Dev

如何在docker文件中获取对我可用的docker环境变量?(使用React / JS / webpack)

来自分类Dev

使用Shell脚本将环境变量注入Jenkins构建过程

来自分类Dev

在服务脚本中使用环境变量

来自分类Dev

在XCode 6.1的“构建阶段”中使用“运行脚本”时,如何使用〜/ .bash_profile环境变量?

来自分类Dev

如何在docker-compose.yml的.env文件中使用环境变量?

来自分类Dev

如何在Dockerfile中使用docker-compose.yml中的环境变量?

来自分类Dev

如何在Jenkinsfile中使用docker image内部环境变量

来自分类Dev

如何在 Shibboleth xml 文件中使用/访问 docker 环境变量?

来自分类Dev

如何在Docker容器中使用pwd设置环境变量

来自分类Dev

如何在生产中的 docker-compose 中使用环境变量?

来自分类Dev

如何在Spring中使用junit测试获取jndi环境变量?

Related 相关文章

  1. 1

    Docker如何在构建过程中在Dockerfile中使用env_file变量

  2. 2

    如何在cli构建中使用环境变量

  3. 3

    如何在Robot框架脚本中使用环境变量

  4. 4

    如何在Passenger-docker容器的启动脚本中使用环境变量

  5. 5

    如何在docker run命令中使用环境变量?

  6. 6

    如何在ENTRYPOINT数组中使用Docker环境变量?

  7. 7

    如何在Docker Compose中使用环境变量

  8. 8

    如何在Docker ENTRYPOINT中使用撰写环境变量

  9. 9

    如何在docker args中使用环境变量

  10. 10

    如何在shell脚本中使环境变量“导出”?

  11. 11

    如何在npm脚本中获取环境变量?

  12. 12

    如何在Fish中使用键盘快捷键来扩展环境变量?

  13. 13

    在clion中使用远程模式时,如何从远程主机上的脚本中获取环境变量?

  14. 14

    构建Dockerfile时如何使用docker机器的环境变量

  15. 15

    如何在Django启动过程中检查环境变量

  16. 16

    如何在python的同一shell中使用脚本导出环境变量?

  17. 17

    如何在 jq 脚本文件的命令中使用环境变量?

  18. 18

    使用 envdir 设置运行过程中的环境变量

  19. 19

    如何在docker文件中获取对我可用的docker环境变量?(使用React / JS / webpack)

  20. 20

    使用Shell脚本将环境变量注入Jenkins构建过程

  21. 21

    在服务脚本中使用环境变量

  22. 22

    在XCode 6.1的“构建阶段”中使用“运行脚本”时,如何使用〜/ .bash_profile环境变量?

  23. 23

    如何在docker-compose.yml的.env文件中使用环境变量?

  24. 24

    如何在Dockerfile中使用docker-compose.yml中的环境变量?

  25. 25

    如何在Jenkinsfile中使用docker image内部环境变量

  26. 26

    如何在 Shibboleth xml 文件中使用/访问 docker 环境变量?

  27. 27

    如何在Docker容器中使用pwd设置环境变量

  28. 28

    如何在生产中的 docker-compose 中使用环境变量?

  29. 29

    如何在Spring中使用junit测试获取jndi环境变量?

热门标签

归档