FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-alpine
ENV CORECLR_ENABLE_PROFILING=1 \
CORECLR_PROFILER={846F5F1C-F9AE-4B07-969E-05C26BC060D8} \
CORECLR_PROFILER_PATH=/opt/datadog/Datadog.Trace.ClrProfiler.Native.so \
DD_INTEGRATIONS=/opt/datadog/integrations.json \
DD_DOTNET_TRACER_HOME=/opt/datadog
WORKDIR /app
RUN apk --no-cache update \
&& apk add bash make curl
ARG TRACER_VERSION=1.19.1
RUN mkdir -p /opt/datadog
RUN curl -L https://github.com/DataDog/dd-trace-dotnet/releases/download/v${TRACER_VERSION}/datadog-dotnet-apm-${TRACER_VERSION}.tar.gz \
| tar xzf - -C /opt/datadog
WORKDIR /app
COPY --from=buildcontainer /app/build .
COPY ./Entrypoint.sh /
RUN chmod +x /Entrypoint.sh && /Entrypoint.sh
ENTRYPOINT ["dotnet","testdatadog.dll"]
Entrypoint.sh
#!/bin/bash
set -e
curl http://169.254.169.254/latest/meta-data/local-ipv4 > temp_var
export DD_AGENT_HOST=$(cat temp_var)
exec "$@"
当我进入ec2并查看环境变量时,没有看到DD_AGENT_HOST设置。当我手动尝试设置环境时,它可以工作。我想念什么吗?感谢您的投入。
答案 0 :(得分:0)
此:
RUN chmod +x /Entrypoint.sh && /Entrypoint.sh
实际上运行以下命令:
bash -c "chmod +x /Entrypoint.sh && /Entrypoint.sh"
您的脚本为运行它的Bash实例设置了环境变量,该脚本在脚本完成后立即退出,并丢弃其环境。
您需要将Entrypoint.sh
的执行移至ENTRYPOINT行。
编辑:
这就是我的测试Dockerfile
(请注意,对脚本的复制和更改权限是在单独的阶段完成的,以减小最终图像的大小):
FROM alpine:latest AS build
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
FROM alpine:latest
RUN apk add --no-cache bash
COPY --from=build /entrypoint.sh /entrypoint.sh
ENTRYPOINT [ "/entrypoint.sh", "sleep", "10m" ]
和entrypoint.sh
:
#!/bin/bash
set -e
echo "127.0.0.1" > temp_var
export DD_AGENT_HOST=$(cat temp_var)
exec "$@"
我运行了以下命令:
docker build -t entrypoint-test .
docker run -itd --rm --name entrypoint entrypoint-test:latest
docker exec -it entrypoint bash
并在新打开的Bash shell中:
export
结果:
declare -x HOME="/root"
declare -x HOSTNAME="c951e699bf7b"
declare -x OLDPWD
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
declare -x PWD="/"
declare -x SHLVL="1"
declare -x TERM="xterm"
否DD_AGENT_HOST
!
因此,我搜索了容器的主进程(在我的情况下为sleep
)
ps -a | grep sleep
得到
1 root 0:00 sleep 10m
32 root 0:00 grep sleep
最后我跑了
strings /proc/1/environ
查看该过程的环境。
结果:
HOSTNAME=3f9760ceb473
PWD=/
HOME=/root
TERM=xterm
SHLVL=0
DD_AGENT_HOST=127.0.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DD_AGENT_HOST
找到了!
那是怎么回事?
很简单。 entrypoint.sh
仅针对执行过程设置变量-在我的情况下为sleep
。 docker exec
创建一个运行Bash的新的,不相关的进程。由于新进程(在Linux和Windows中都是)从父进程继承环境,并且由docker exec
产生的新Bash进程不是容器主进程的子级(而是同级),因此它没有DD_AGENT_HOST
变量的知识。
我希望这会有所帮助。
编辑2:
我相信David Maze的意思是您可以替换
ENTRYPOINT [ "/entrypoint.sh", "sleep", "10m" ]
使用
ENTRYPOINT [ "/entrypoint.sh" ]
CMD [ "sleep", "10m" ]
然后您可以运行
docker run -it --rm --name entrypoint entrypoint-test:latest bash
使entrypoint.sh
执行bash
而不是sleep 10m
,从而使您可以直接检查环境,而不必通过/proc/$pid/environ
。
Dockerfile中的等效项为:
ENTRYPOINT [ "/Entrypoint.sh" ]
CMD [ "dotnet" , "testdatadog.dll" ]
答案 1 :(得分:0)
问题的要点在于您的指令// theMainString is the string from which I want the characters replaced
let theMainString = "<div>Hello World</div>";
let s1, s2;
s1 = (theMainString).replace("<", "<");
s2 = s1.replace(">", ">");
console.log(s2);
// Output: "<div>Hello World</div>"
Any help would be highly appreciated
是在构建时执行的,并且对您的RUNTIME环境没有影响。
Konrad正确地将ENTRYPOINT更改为让Entrypoint.sh改变您的环境。
Konrad解决方案的问题在于,他用来启动容器的RUN chmod +x /Entrypoint.sh && /Entrypoint.sh
命令对docker在发出run
命令时运行的bash shell没有影响。
稍微扩展Konrad的答案,您实际上可以获取entrypoint.sh来为您设置环境。
我复制了Konrad的Dockerfile,但如下更改了ENTRYPOINT:
exec
现在,entrypoint.sh将设置环境并执行FROM alpine:latest AS build
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
FROM alpine:latest
RUN apk add --no-cache bash
COPY --from=build /entrypoint.sh /entrypoint.sh
ENTRYPOINT [ "/entrypoint.sh", "bash" ]
。
我使用Konrad的命令来运行容器:
bash
这将导致启动容器。 Entrypoint.sh将为我们运行bash,但它处于守护程序模式,因此我们必须附加到它:
docker run -itd --rm --name entrypoint entrypoint-test:latest
24a7f3d740c37bb345374a835a465482e3bf49a04361e55205b6d63af48d5c3d
或者,您可以仅运行不带$ docker attach 24a7f3d740c37bb345374a835a465482e3bf49a04361e55205b6d63af48d5c3d
bash-5.0# echo $DD_AGENT_HOST
127.0.0.1
选项的Docker映像,而避免使用守护程序模式:
-d
所有这些,对您的dotnet调用有用吗?
$ docker run -it --rm --name entrypoint entrypoint-test:latest
bash-5.0# echo $DD_AGENT_HOST
127.0.0.1
bash-5.0# echo Hit Ctrl-P Ctrl-Q to leave this container running