# 2.启动容器

{% hint style="success" %}
对应的[官方页面地址](https://github.com/dani-garcia/vaultwarden/wiki/Starting-a-Container)
{% endhint %}

请注意，`docker run` 命令的名字略有误导性，因为它不仅会创建一个容器，它还会启动此容器。当在仅停止容器而不移除此容器后使用 `docker run` 命令时，会导致发生冲突。为了一个简单的开始，请接着往下看。

## 创建容器 <a href="#creating-the-container" id="creating-the-container"></a>

持久性数据存储在容器内的 `/data` 下，因此使用 Docker 进行持久性部署的唯一要求是挂载持久性卷。创建一个本地目录来映射容器的持久存储：

```shell
mkdir /vw-data
```

如果你碰巧使用 SELinux (RHEL & Clones / Fedora)，你必须设置持久存储的上下文，以便容器可以写入它：

```batch
semanage fcontext -a -t svirt_sandbox_file_t '/vw-data(/.*)?'
restorecon -Rv /vw-data
```

```shell
# 使用 Docker：
docker run -d --name vaultwarden -v /vw-data/:/data/ -p 80:80 vaultwarden/server:latest
# 使用 Podman as non-root：
podman run -d --name vaultwarden -v /vw-data/:/data/:Z -e ROCKET_PORT=8080 -p 8080:8080 vaultwarden/server:latest
# 使用 Podman as root：
sudo podman run -d --name vaultwarden -v vw-data:/data/:Z -p 80:80 vaultwarden/server:latest
```

所有持久性数据将保存在 `/vw-data/` 路径下，您可以根据自己的需要调整此路径。

该服务将暴露在主机的 80 或 8080 端口上。默认情况下，非 root 容器不允许使用特权端口 (<1024)，因此需要通过端口映射来传递 `ROCKET_PORT` 环境变量以更改 Vaultwarden 的监听端口。

对于非 x86 硬件或要运行特定版本，可以[选择其他镜像](/container-image-usage/which-container-image-to-use.md)。

如果您的 docker/vaultwarden 运行在具有固定 IP 的设备上，则可以将主机端口绑定到该 IP 地址，从而避免将主机端口暴露到网络上。如下所示，将 IP 地址（例如 192.168.0.2）添加到主机端口和容器端口前面：

```shell
# 使用 Docker：
docker run -d --name vaultwarden -v /vw-data/:/data/ -p 192.168.0.2:80:80 vaultwarden/server:latest
```

## 启动容器 <a href="#starting-the-container" id="starting-the-container"></a>

如果运行了 `docker stop vaultwarden` 命令，或重启，亦或任何其他原因，容器停止了，则可以使用以下命令将其启动：

```shell
docker start vaultwarden
```

## 自定义容器启动 <a href="#customizing-container-startup" id="customizing-container-startup"></a>

如果您想在容器启动时运行自定义启动脚本，可以将 `/etc/vaultwarden.sh` 作为单个脚本和/或将 `/etc/vaultwarden.d` 作为脚本目录挂载到容器中。对于后一种情况，只有扩展名为 `.sh` 的文件才会运行，因此具有其他扩展名的文件（例如，data/config 文件）则可以驻留在同一个目录中（具体的工作方式请参见 [start.sh](https://github.com/dani-garcia/vaultwarden/blob/main/docker/start.sh)）。

自定义启动脚本对于修补网页密码库文件或安装额外的包、CA 证书等非常有用，因为可以让您不必构建和维护您自己的 Docker 镜像。

### 示例 <a href="#example" id="example"></a>

假设您的脚本名为 `init.sh`，其包含以下内容：

```shell
echo "starting up"
```

您可以像这样在启动时运行此脚本：

```shell
docker run -d --name vaultwarden -v $(pwd)/init.sh:/etc/vaultwarden.sh <other docker args...> vaultwarden/server:latest
```

如果您运行 `docker logs vaultwarden`，现在您应该能看到 `starting up` 作为输出的第一行。

请注意，每次容器启动时都会运行初始化脚本（而不仅仅是第一次），所以这些脚本通常应该是幂等的（即，您可以多次运行这些脚本而不会出现不良/异常）。如果您的脚本天然没有此属性，你可以这样做：

```shell
if [ ! -e /.init ]; then
  touch /.init

  # 运行您的初始化步骤...
fi
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://rs.ppgg.in/container-image-usage/starting-a-container.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
