挑战访问容器化 DNS-SD
Posted
技术标签:
【中文标题】挑战访问容器化 DNS-SD【英文标题】:Challenged accessing containerized DNS-SD 【发布时间】:2021-03-10 14:08:45 【问题描述】:我是 ZeroConf(和 Rust)菜鸟,当代码被容器化和运行时,我很难理解为什么我无法访问基于 astro-dnssd
示例的服务在一个子shell中。
以下作品:
-
在主机上运行二进制文件和
avahi-browse
:
./server
产量:
avahi-browse -all
+ enp5s0 IPv6 asto-dnssd _rust._tcp local
-
在容器中手动运行二进制文件并在主机上运行
avahi-browse
:
docker run .... --entrypoint=bash [[image]]
> service dbus start
> service avahi-daemon start
> ./service
还有:
+ docker0 IPv4 asto-dnssd _rust._tcp local
-
在启动
dbus
和avahi-daemon
后在子shell 中运行二进制文件:
docker run .... --entrypoint=bash [[image]]
> service dbus start
> service avahi-daemon start
> bash -c "./service"
但是,如果我在子 shell 中启动服务并运行二进制文件,什么都不会:
docker run .... --entrypoint=bash [[image]]
> bash -c "service dbus start && service avahi-daemon start && ./service"
为什么会这样?
我有另一个使用 zeronconf
板条箱的示例,这样可以正常工作。
IIUC 我必须在容器映像中在服务器之前启动dbus
和avahi-daemon
,并且使用子shell 是正确的(!?)方法:
ARG PROJECT=astro-dnssd
FROM rustlang/rust:nightly-slim as builder
ARG PROJECT
RUN apt update && \
apt install -y libavahi-compat-libdnssd-dev
RUN USER=root cargo new --bin $PROJECT
WORKDIR /$PROJECT
COPY ./Cargo.toml ./Cargo.toml
RUN cargo build --release
RUN rm src/*.rs
ADD . ./
# Replace hyphens with underscores in $PROJECT
RUN rm ./target/release/deps/$(echo $PROJECT | tr '-' '_')*
RUN cargo build --release
FROM debian:buster-slim as runtime
ARG PROJECT
WORKDIR /bin
# Copy from builder and rename to 'server'
COPY --from=builder /$PROJECT/target/release/$PROJECT ./server
RUN apt update \
&& apt install -y \
libavahi-compat-libdnssd-dev \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /var/run/dbus
ENTRYPOINT ["bash", "-c", "service dbus start && service avahi-daemon start && ./server"]
【问题讨论】:
【参考方案1】:已解决:时机。
如果我在服务启动之间添加sleep
,这似乎可以让系统有时间正常工作:
这不起作用:
(
service dbus start
service avahi-daemon start
/release/astro-dnssd
)
但这确实:
(
service dbus start
service avahi-daemon start
sleep 2s
/release/astro-dnssd
)
【讨论】:
以上是关于挑战访问容器化 DNS-SD的主要内容,如果未能解决你的问题,请参考以下文章