【发布时间】: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"]
【问题讨论】: