我的Dockerfile
:
# https://hub.docker.com/_/php/
FROM php:5.5.23-fpm
USER www-data
ADD .bash_profile /var/www/.bash_profile
SHELL ["/bin/bash", "-c"]
RUN source /var/www/.bash_profile
然后在容器构建之后运行docker exec -it CONTAINER_NAME bash
我没有看到我的别名定义到/var/www/.bash_profile
。但如果我手动执行source /var/www/.bash_profile
- 一切正常。
此处描述的问题相同:https://github.com/docker/kitematic/issues/896但没有答案。
答案 0 :(得分:4)
那是因为那些(即' RUN'' SHELL')是构建指令。当您执行docker run
时,ENTRYPOINT
和COMMAND
正在执行。
docker exec
只需进入现有容器的命名空间并执行命令。所以在你的情况下它只运行bash
。这就是您必须再次提供个人资料的原因。
更新:
此代码段来自man bash
:
当启动不是登录shell的交互式shell时,bash会从中读取并执行命令 /etc/bash.bashrc和〜/ .bashrc,如果存在这些文件。
所以在您的情况下,如果您将文件名更改为~/.bashrc
可能有效
答案 1 :(得分:0)
有一个类似的问题,最简单的解决方案是使用-l选项进行bash使bash像被作为登录shell一样被调用。
docker run --rm -it $IMAGE /bin/bash -l
bash随后将读取〜/ .bash_profile
答案 2 :(得分:0)
我遇到了类似的问题。 Dockerfile 相关片段:
RUN scripts/script1.sh
RUN scripts/script2.sh
来自scripts/script1.sh
的片段
echo "TEST_ENV=Hello" >> ~/.bashrc
source ~/.bashrc
来自scripts/script2.sh
的片段
echo $TEST_ENV
echo
中的 script2
语句没有打印任何内容,即 script2
根本看不到 TEST_ENV
变量。
所以,事实证明每条 RUN
指令都是在自己的 shell 中执行的。因此,环境变量只会在执行 source ~/.bashrc
的 shell 中可见,也就是运行 script1
的 shell。要使其在 script2
的 shell 中可见,必须从 source ~/.bashrc
执行独占 script2
。
如果运行容器中需要存在环境变量,则作为 Docker 的 ENTRYPOINT
或 COMMAND
的一部分运行的代码应源自 .bashrc
文件。使用 docker exec -it <container name> /bin/bash
登录正在运行的容器,将证明确实设置了环境变量。